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 源码
StringRedisTemplate源码,
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;
}
}