【Redis】Java操作Redis:StringRedisTemplate

在上前两篇文章,我们分别介绍了 Jedis 和 RedisTemplate,那么,我们使用 RedisTemplate 已经可以完成对 redis 的操作了,但是它却存在一点瑕疵。因为通过 redis-cli 查看时,会发现 key 和 value 都是乱码的,比如 key 是这样的 \xac\xed\x00\x05t\x00\key (如下图)。

在这里插入图片描述
那解决办法是什么呢?将 RedisTemplate 换成 StringRedisTemplate。

public class StringRedisTemplate extends RedisTemplate<String, String> {
     

	public StringRedisTemplate() {
     
		RedisSerializer<String> stringSerializer = new StringRedisSerializer();
		setKeySerializer(stringSerializer);
		setValueSerializer(stringSerializer);
		setHashKeySerializer(stringSerializer);
		setHashValueSerializer(stringSerializer);
	}

	public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
     
		this();
		setConnectionFactory(connectionFactory);
		afterPropertiesSet();
	}

	protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
     
		return new DefaultStringRedisConnection(connection);
	}
}

StringRedisTemplate 就是继承了 RedisTemplate

一般来说子类继承父类,应该能实现更多的功能,但是此处我们发现 StringRedisTemplate 继承的是 RedisTemplate的泛型类,指定了String-String的泛型!故功能只专注于String类型!也可以说成StringRedisTemplate无非就是限定了 K,V 为 String类型的RedisTemplate。

在它的构造函数中设置了序列化规则,key、value、hashKey、hashValue的序列化规则都为 RedisSerializer.string()。

问题一:RedisTemplate 和 StringRedisTemplate 的区别?

  1. 操作范围不同:

    1. StringRedisTemplate只能对key=String,value=String的键值对进行操作
    2. RedisTemplate可以对任何类型的key-value键值对操作
  2. 序列化策略不同:

    • StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
    • RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

因为序列化方式不同,所以两者的数据是不共通的。也就是说RedisTemplate不能取StringRedisTemplate存入的数据,StringRedisTemplate不能取RedisTemplate存入的数据。

问题二:RedisTemplate 和 StringRedisTemplate 如何选择?

  1. 如果 key, value, hashKey, hashValue 都是 String类型直接使用 StringRedisTemplate 就好。
  2. 如果我们存一些简单的数据结构,建议使用StringRedisTemplate,因为方便在数据库中查看。通常项目中都是 String 类型作为key,主要是开发人员方便自己识别,而key 的序列化也会使用 string 序列化,这样在命令行环境下 get 查询的时候 直接使用定义的key字符串就能查询到值。
  3. 如果我们存一些复杂的数据接口,比如对象里面还包含多个对象的,就建议使用RedisTemplate了,系统会帮忙转换,省去我们自己转换的麻烦。当然,也可以自己先序列化成json字符串然后保存,不过这样在get 或者set 的时候需要进行相应转换操作。

关于SpringBoot

SpringBoot 2.0已经使用Lettuce代替Jedis

其实,随着Spring Boot2.x的到来,支持的组件越来越丰富,也越来越成熟,其中对Redis的支持不仅仅是丰富了它的API,更是替换掉底层Jedis的依赖,取而代之换成了Lettuce高级Redis客户端,用于多线程安全同步,异步和响应使用。

LettuceJedis的都是连接Redis Server的客户端程序。Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连接池JedisPool,为每个Jedis实例增加物理连接。Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。

为了多线程安全,以前是Jedis+JedisPool组合 ,现在在SpringBoot 2.0应用中直接使用Lettuce客户端的API封装RedisTemplate即可只要配置好连接池属性,那么SpringBoot就能自动管理连接池。

你可能感兴趣的:(数据存储,redis,java)