jedis是redis官网推荐的一个面向java客服端,库文件实现了对各类API进行封装调用。

lettuce是一个redis的驱动包,Lettuce译为生菜。

jedis和lettuce都是redis的客户端,他们可以连接redis服务器.但是在springbot2.0以后都是使用的Lettuce客户端。因为当使用jedis连接redis服务器的时候,每个线程都要拿自己创建的实例去连接redis服务端,当有多个线程的时候,不仅开销大,还需要反复创建和关闭一个jedis连接,而且也是线程不安全的,一个线程通过Jedis实例更改redis服务器中数据会影响另一个线程。

但是如果用lettuce连接redis服务器的时候,就不会出现上面的情况,lettuce底层使用的是netty.当有多个线程需要连接redis服务器的时候,可以保证只创建一个lettuce连接。这样可以减少创建或关闭lettuce连接时候的开销。而这种方式是线程安全的。不会出现一个线程通过lettuce更改Redis服务器中的数据之后而影响另一个线程的情况。
Lettuce是基于Netty框架的事件驱动的Redis客户端,其方法调用是异步的,Lettuce的API也是线程安全的**,所以多个线程可以操作单个Lettuce连接来完成各种操作,同时Lettuce也支持连接池.**

RedisTemplate
key,value都是通过spring 提供的serializer序列化到数据库
RedisTemplate 提供的是JdkSeriallizationRedisSerializer会有乱码
key 被序列化成\xac\xed…,线程通过key 去查询value非常不方便。
StirngRedisTemplate 提供的是 StringRedisSerizalizer,不会乱码问题

RedsTemplate 源码
RedisTemplate-LMLPHP
StringRedisTemplate源码,
RedisTemplate-LMLPHP

redis-cli --raw 可处理 redis-cli中文乱码

解决redisTemplate的方案

@Configuration
@EnableRedisRepositories
public class RedisConfiguration {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);

        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule timeModule = new JavaTimeModule();
        timeModule.addDeserializer(LocalDateTime.class,
                new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        timeModule.addSerializer(LocalDateTime.class,
                new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        objectMapper.disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
        objectMapper.registerModules(timeModule);
        objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(),
                ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);

        objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//乱码处理

        StringRedisSerializer serializer = new StringRedisSerializer();
        // 将key 序列化为string
        redisTemplate.setKeySerializer(serializer);
       
        redisTemplate.setHashKeySerializer(serializer);

        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);
         // 将value 序列化为json
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;

    }
}

05-24 04:55