关于springboot集成redis及关于redis的Key 乱码问题

一、在pom文件中引入redis


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

二、配置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

三、编写操作Redis的工具类

关于springboot集成redis及关于redis的Key 乱码问题

四、接下来要说的就是关于key值"乱码"问题

这次主要的问题是,在这过程中可以操作Redis数据库 ,但是在登陆服务器的时候用redis-cli查看key的时候找不到相对应的key,而是出现了以下的这种情况
关于springboot集成redis及关于redis的Key 乱码问题

那么在存key的时候为什么会出现这种"乱码"的情况呢?

其实这里的"乱码"并不是真的乱码,那是因为我们还缺少了一点配置,那就是对Redis存key或者value的时候,没有配置字符串序列化。没有配置的话是默认使用jdk本身的序列化的,点进去RedisTemplate里面去看,可以看到
关于springboot集成redis及关于redis的Key 乱码问题

关于springboot集成redis及关于redis的Key 乱码问题

因为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类型:

关于springboot集成redis及关于redis的Key 乱码问题

其实在这里应该先提前利用springboot的自动装配,先将这些东西配置好,这些配置在网上可以找到,springboot集成redis配置

@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也可以正常使用的,不过为了防止日后出现问题方便排查,还是花一点点时间将这些配置加上吧~

相关推荐