工具類
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.myproject.core.config.SpringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.CollectionUtils;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* TODO
*
* @Author Simon <[email protected]>
* @Date 2019/3/3 21:39
*/
public class RedisUtils {
private static StringRedisTemplate stringRedisTemplate = SpringUtils.getBean("stringRedisTemplate");
private static RedisTemplate<String, Object> redisTemplate = SpringUtils.getBean("redisTemplate");
/**
* 删除緩存<br>
* 根據key精确比對删除
* @param key
*/
@SuppressWarnings("unchecked")
public static void del(String... key){
if(key!=null && key.length > 0){
if(key.length == 1){
redisTemplate.delete(key[0]);
}else{
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
/**
* 批量删除<br>
* (該操作會執行模糊查詢,請盡量不要使用,以免影響性能或誤删)
* @param pattern
*/
public static void batchDel(String... pattern){
for (String kp : pattern) {
redisTemplate.delete(redisTemplate.keys(kp + "*"));
}
}
/**
* 取得緩存(int型)
* @param key
* @return
*/
public static Integer getInt(String key){
String value = stringRedisTemplate.boundValueOps(key).get();
if(StringUtils.isNotBlank(value)){
return Integer.valueOf(value);
}
return null;
}
/**
* 取得緩存(字元串類型)
* @param key
* @return
*/
public static String getStr(String key){
return stringRedisTemplate.boundValueOps(key).get();
}
/**
* 取得緩存(字元串類型)
* @param key
* @return
*/
public static String getStr(String key, boolean retain){
String value = stringRedisTemplate.boundValueOps(key).get();
if(!retain){
redisTemplate.delete(key);
}
return value;
}
/**
* 擷取緩存<br>
* 注:基本資料類型(Character除外),請直接使用get(String key, Class<T> clazz)取值
* @param key
* @return
*/
public static Object getObj(String key){
return redisTemplate.boundValueOps(key).get();
}
/**
* 擷取緩存<br>
* 注:java 8種基本類型的資料請直接使用get(String key, Class<T> clazz)取值
* @param key
* @param retain 是否保留
* @return
*/
public static Object getObj(String key, boolean retain){
Object obj = redisTemplate.boundValueOps(key).get();
if(!retain){
redisTemplate.delete(key);
}
return obj;
}
/**
* 擷取緩存<br>
* 注:該方法暫不支援Character資料類型
* @param key key
* @param clazz 類型
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T get(String key, Class<T> clazz) {
return (T)redisTemplate.boundValueOps(key).get();
}
/**
* 擷取緩存json對象<br>
* @param key key
* @param clazz 類型
* @return
*/
public static <T> T getJson(String key, Class<T> clazz) {
return JsonMapper.fromJsonString(stringRedisTemplate.boundValueOps(key).get(), clazz);
}
/**
* 将value對象寫入緩存
* @param key
* @param value
* @param time 失效時間(秒)
*/
public static void set(String key,Object value,ExpireTime time){
if(value.getClass().equals(String.class)){
stringRedisTemplate.opsForValue().set(key, value.toString());
}else if(value.getClass().equals(Integer.class)){
stringRedisTemplate.opsForValue().set(key, value.toString());
}else if(value.getClass().equals(Double.class)){
stringRedisTemplate.opsForValue().set(key, value.toString());
}else if(value.getClass().equals(Float.class)){
stringRedisTemplate.opsForValue().set(key, value.toString());
}else if(value.getClass().equals(Short.class)){
stringRedisTemplate.opsForValue().set(key, value.toString());
}else if(value.getClass().equals(Long.class)){
stringRedisTemplate.opsForValue().set(key, value.toString());
}else if(value.getClass().equals(Boolean.class)){
stringRedisTemplate.opsForValue().set(key, value.toString());
}else{
redisTemplate.opsForValue().set(key, value);
}
if(time.getTime() > 0){
redisTemplate.expire(key, time.getTime(), TimeUnit.SECONDS);
}
}
/**
* 将value對象以JSON格式寫入緩存
* @param key
* @param value
* @param time 失效時間(秒)
*/
public static void setJson(String key,Object value,ExpireTime time){
stringRedisTemplate.opsForValue().set(key, JsonMapper.toJsonString(value));
if(time.getTime() > 0){
stringRedisTemplate.expire(key, time.getTime(), TimeUnit.SECONDS);
}
}
/**
* 更新key對象field的值
* @param key 緩存key
* @param field 緩存對象field
* @param value 緩存對象field值
*/
public static void setJsonField(String key, String field, String value){
JSONObject obj = JSON.parseObject(stringRedisTemplate.boundValueOps(key).get());
obj.put(field, value);
stringRedisTemplate.opsForValue().set(key, obj.toJSONString());
}
/**
* 遞減操作
* @param key
* @param by
* @return
*/
public static double decr(String key, double by){
return redisTemplate.opsForValue().increment(key, -by);
}
/**
* 遞增操作
* @param key
* @param by
* @return
*/
public static double incr(String key, double by){
return redisTemplate.opsForValue().increment(key, by);
}
/**
* 遞增操作
* @param key
* @return
*/
public static long incr(String key){
return redisTemplate.opsForValue().increment(key);
}
/**
* 擷取double類型值
* @param key
* @return
*/
public static double getDouble(String key) {
String value = stringRedisTemplate.boundValueOps(key).get();
if(StringUtils.isNotBlank(value)){
return Double.valueOf(value);
}
return 0d;
}
/**
* 設定double類型值
* @param key
* @param value
* @param time 失效時間(秒)
*/
public static void setDouble(String key, double value, ExpireTime time) {
stringRedisTemplate.opsForValue().set(key, String.valueOf(value));
if(time.getTime() > 0){
stringRedisTemplate.expire(key, time.getTime(), TimeUnit.SECONDS);
}
}
/**
* 設定double類型值
* @param key
* @param value
* @param time 失效時間(秒)
*/
public static void setInt(String key, int value, ExpireTime time) {
stringRedisTemplate.opsForValue().set(key, String.valueOf(value));
if(time.getTime() > 0){
stringRedisTemplate.expire(key, time.getTime(), TimeUnit.SECONDS);
}
}
/**
* 将map寫入緩存
* @param key
* @param map
* @param time 失效時間(秒)
*/
public static <T> void setMap(String key, Map<String, T> map, ExpireTime time){
redisTemplate.opsForHash().putAll(key, map);
}
/**
* 将map寫入緩存
* @param key
* @param obj
* @param time 失效時間(秒)
*/
@SuppressWarnings("unchecked")
public static <T> void setMap(String key, T obj, ExpireTime time){
Map<String, String> map = (Map<String, String>)JsonMapper.parseObject(obj, Map.class);
redisTemplate.opsForHash().putAll(key, map);
}
/**
* 向key對應的map中添加緩存對象
* @param key
* @param map
*/
public static <T> void addMap(String key, Map<String, T> map){
redisTemplate.opsForHash().putAll(key, map);
}
/**
* 向key對應的map中添加緩存對象
* @param key cache對象key
* @param field map對應的key
* @param value 值
*/
public static void addMap(String key, String field, String value){
redisTemplate.opsForHash().put(key, field, value);
}
/**
* 向key對應的map中添加緩存對象
* @param key cache對象key
* @param field map對應的key
* @param obj 對象
*/
public static <T> void addMap(String key, String field, T obj){
redisTemplate.opsForHash().put(key, field, obj);
}
/**
* 擷取map緩存
* @param key
* @param clazz
* @return
*/
public static <T> Map<String, T> mget(String key, Class<T> clazz){
BoundHashOperations<String, String, T> boundHashOperations = redisTemplate.boundHashOps(key);
return boundHashOperations.entries();
}
/**
* 擷取map緩存
* @param key
* @param clazz
* @return
*/
public static <T> T getMap(String key, Class<T> clazz){
BoundHashOperations<String, String, String> boundHashOperations = redisTemplate.boundHashOps(key);
Map<String, String> map = boundHashOperations.entries();
return JsonMapper.parseObject(map, clazz);
}
/**
* 擷取map緩存中的某個對象
* @param key
* @param field
* @param clazz
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getMapField(String key, String field, Class<T> clazz){
return (T)redisTemplate.boundHashOps(key).get(field);
}
/**
* 删除map中的某個對象
* @author lh
* @date 2016年8月10日
* @param key map對應的key
* @param field map中該對象的key
*/
public void delMapField(String key, String... field){
BoundHashOperations<String, String, ?> boundHashOperations = redisTemplate.boundHashOps(key);
boundHashOperations.delete(field);
}
/**
* 指定緩存的失效時間
*
* @author FangJun
* @date 2016年8月14日
* @param key 緩存KEY
* @param time 失效時間(秒)
*/
public static void expire(String key, ExpireTime time) {
if(time.getTime() > 0){
redisTemplate.expire(key, time.getTime(), TimeUnit.SECONDS);
}
}
/**
* 添加set
* @param key
* @param value
*/
public static void sadd(String key, String... value) {
redisTemplate.boundSetOps(key).add(value);
}
/**
* 删除set集合中的對象
* @param key
* @param value
*/
public static void srem(String key, String... value) {
redisTemplate.boundSetOps(key).remove(value);
}
/**
* set重命名
* @param oldkey
* @param newkey
*/
public static void srename(String oldkey, String newkey){
redisTemplate.boundSetOps(oldkey).rename(newkey);
}
/**
* 短信緩存
* @author fxl
* @date 2016年9月11日
* @param key
* @param value
* @param time
*/
public static void setIntForPhone(String key,Object value,int time){
stringRedisTemplate.opsForValue().set(key, JsonMapper.toJsonString(value));
if(time > 0){
stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);
}
}
/**
* 模糊查詢keys
* @param pattern
* @return
*/
public static Set<String> keys(String pattern){
return redisTemplate.keys(pattern);
}
/**
* 判斷集合是否存在
*
* @param key
* @param obj
* @return
*/
public static Boolean isMember(String key, Object obj){
return redisTemplate.opsForSet().isMember(key,obj);
}
}
Key 亂碼(
\xAC\xED\x00\x05t\x00\x0
)問題解決
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* TODO
*
* @Author Simon <[email protected]>
* @Date 2019/3/3 21:39
*/
@Configuration
public class RedisConfigurtion {
@Autowired
private RedisTemplate redisTemplate;
@Bean
public RedisTemplate<String, Object> stringSerializerRedisTemplate() {
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
return redisTemplate;
}
}