天天看點

Spring boot 中使用 spring-boot-starter-data-redis 封裝工具類以及Key亂碼問題

工具類

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;
    }

}

           

繼續閱讀