Spring Boot提供了对应的Starter,maven坐标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
演示代码:
@Test
public void stringTest() throws Exception{
ValueOperations valueOperations = redisTemplate.opsForValue();
//当向Redis写入数据时,会对key跟value进行序列化,默认使用的序列化器
//当从Redis读取数据时,会对key跟value进行反序列化
//为什么要这么做?
valueOperations.set("name2","jack",20,TimeUnit.SECONDS);
String name = (String) valueOperations.get("name2");
System.out.println(name);
Boolean flag = valueOperations.setIfAbsent("name", "tom");
System.out.println(flag);
flag = valueOperations.setIfAbsent("gender", "1");
System.out.println(flag);
}
比如说在上面的这个测试类,我拿到了一个valueOperations操作字符的对象
,当我写入时,查看我的redis图形化工具
会看见写入的数据前面会加上一堆url编码,这就是它默认会在你写入的时候把你的key和value使用jdk序列化器给序列化掉。
进入RedisTemplate的源码,你会看到他继承RedisAccrssor。
RedisTemplate也重写这个方法,defaultSerializer是默认的序列化器,当它为空的时候,就会默认使用JdkSerializationRedisSerializer序列化器。
看成员变量
enableDefaultSerializer为true,所以你的Key和value就会使用下面的默认的序列化器(hash也是使用着默认的序列化器)。
defaultUsed就是告诉你有没有使用序列化器,没有就是false和有就是true。
这段代码告诉你enableDefaultSerializer 有没有开启, defaulUsed序列化器有没有使用如果两者成立,defaultSerializer是不是空的如果是的话,默认序列化器是空的,不能序列化,请将所有序列化进行初始化。
所以当从Redis读取数据时,会对key跟value进行反序列化,之所有这么做的原因就是为了安全考虑,但是呢?
我们真正工作中,只需要序列化value不需要序列化key,这样做既可以保障安全,还能提升性能。
我们如果想要达到只对value序列化,而不对key序列化那么就要重新构造RedisTemplate,key使用String序列化器,value使用jdk序列化器。
进入RedisAutoConfiguration自动化配置
如果你没有设置上图被选中的代码,那么默认就是使用它,所以你要copy选中的代码,写一个Redis的配置类。
进入RedisSerializer接口你可以 选中按crtl+H 你会发很多的序列化器
键一般都使用StringRedisSerializer
自己配置的RedisConfiguration类