關於springboot集成redis及關於redis的Key 亂碼問題

1、在pom文件中引入redis


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
    <version>RELEASE</version>
</dependency>

2、配置Redis地址等配置

# Redis數據庫索引(默認爲0)
spring.redis.database= 0  
# Redis服務器地址
spring.redis.host= ip
# Redis服務器鏈接端口
spring.redis.port=6379  
# Redis服務器鏈接密碼(默認爲空)
spring.redis.password= password
# 鏈接池最大鏈接數(使用負值表示沒有限制)
spring.redis.pool.max-active=8  
# 鏈接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1  
# 鏈接池中的最大空閒鏈接
spring.redis.pool.max-idle=8  
# 鏈接池中的最小空閒鏈接
spring.redis.pool.min-idle=0  
# 鏈接超時時間(毫秒)
spring.redis.timeout=0

3、編寫操做Redis的工具類

圖片描述

4、接下來要說的就是關於key值"亂碼"問題

此次主要的問題是,在這過程當中能夠操做Redis數據庫 ,可是在登錄服務器的時候用redis-cli查看key的時候找不到相對應的key,而是出現瞭如下的這種狀況
圖片描述redis

那麼在存key的時候爲何會出現這種"亂碼"的狀況呢?spring

其實這裏的"亂碼"並非真的亂碼,那是由於咱們還缺乏了一點配置,那就是對Redis存key或者value的時候,沒有配置字符串序列化。沒有配置的話是默認使用jdk自己的序列化的,點進去RedisTemplate裏面去看,能夠看到
圖片描述數據庫

圖片描述

由於spring操做redis是在jedis客戶端基礎上進行的,而jedis客戶端與redis交互的時候協議中定義是用byte類型交互,看到spring-data-redis中RedisTemplate<K, V>在操做的時候k,v是泛型對象,而不是byte[]類型的,這樣致使的一個問題就是,若是不對RedisTemplate進行設置,spring會默認採用defaultSerializer = new JdkSerializationRedisSerializer();這個方法來對key、value進行序列化操做,使用默認的jdk序列化。這樣子存到Redis裏面,在服務器上登錄redis-cli查看key的時候找不到咱們存儲的那個key,而是加了一堆亂碼的key,因此在這裏我簡單的作了一下配置,將存儲的key/value設置成string類型:json

圖片描述

其實在這裏應該先提早利用springboot的自動裝配,先將這些東西配置好,這些配置在網上能夠找到,springboot集成redis配置springboot

@Configuration
@EnableAutoConfiguration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate redisTemplate = new StringRedisTemplate(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        //設置完這個能夠直接將對象以json格式存入redis中,可是取出來的時候要用JSON.parseArray(Json.toJsonString(object),Object.class)解析一下
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        //調用後完成設置
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

其實不用配置這些,Redis也能夠正常使用的,不過爲了防止往後出現問題方便排查,仍是花一點點時間將這些配置加上吧~服務器

相關文章
相關標籤/搜索