这两个类StringRedisTemplate和RedisTemplate,这两个类是springboot-data-redis对Redis进行操作的实现类。
RedisTemplate是泛型类,而在StringRedisTemplate继承RedisTemplate类时,则是指定了泛型的类型,两个String。
这就直接导致了,StringRedisTemplate只能处理String-String的键值对数据,而RedisTemplate则可以处理任何类型的键值对。
spring-data-redis提供如下几种选择:
GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
JacksonJsonRedisSerializer: 序列化object对象为json字符串
JdkSerializationRedisSerializer: 序列化java对象
StringRedisSerializer: 简单的字符串序列化
使用RedisTemplate需要更改序列化方式:
RedisSerializer stringSerializer = new StringRedisSerializer();
template.setKeySerializer(stringSerializer );
template.setValueSerializer(stringSerializer );
template.setHashKeySerializer(stringSerializer );
template.setHashValueSerializer(stringSerializer );
RedisTemplate和StringRedisTemplate的区别:
1. 两者的关系是StringRedisTemplate继承RedisTemplate。
2. 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
3. SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
StringRedisTemplate默认采用的是
String的序列化策略
,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默认采用的是
JDK的序列化策略
,保存的key和value都是采用此策略序列化保存的。
RedisTemplate使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面
当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这样就会导致一个问题,当需要获取的数据不是以字节数组存在redis当中而是正常的可读的字符串的时候,比如说下面这种形式的数据
RedisTemplate就无法获取导数据,这个时候获取到的值就是NULL。这个时候StringRedisTempate就派上了用场。
当Redis当中的数据值是以可读的形式显示出来的时候,只能使用StringRedisTemplate才能获取到里面的数据。
使用时注意事项:
(1)当你的Redis数据库里面本来存的是字符串数据或者是你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可;
(2)但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择;
(3)RedisTemplate中存取数据都是字节数组。当Redis职工存入的数据是可读形式而非字节数组时,使用RedisTemplate取值的时候会无法获取导出数据,获得的值为null。可以使用StringRedisTemplate试试;
RedisTemplate常用方法:
redisTemplate有两个方法经常用到,一个是opsForXXX一个是boundXXXOps,XXX是value的类型,前者获取到一个Opercation,但是没有指定操作的key,可以在一个连接(事务)内操作多个key以及对应的value;后者会获取到一个指定了key的operation,在一个连接内只操作这个key对应的value。
RedisTemplate定义了5种数据结构操作:
redisTemplate.opsForValue(); //操作字符串
redisTemplate.opsForHash(); //操作hash
redisTemplate.opsForList(); //操作list
redisTemplate.opsForSet(); //操作set
redisTemplate.opsForZSet(); //操作有序set
redis中的数据类型:
键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
注意:
ValueOperation和BoundValueOperation的区别:
ValueOperations valueOperations = redisTemplate.opsForValue();
BoundValueOperations boundValueOps = redisTemplate.boundValueOps(“key”);
StringRedisTemplate常用操作:
stringRedisTemplate.opsForValue().set("user", "100",60*10,TimeUnit.SECONDS);//向redis里存入数据和设置缓存时间 stringRedisTemplate.boundValueOps("user").increment(-1);//val做-1操作stringRedisTemplate.opsForValue().get("user")//根据key获取缓存中的valstringRedisTemplate.boundValueOps("user").increment(1);//val +1stringRedisTemplate.getExpire("user")//根据key获取过期时间stringRedisTemplate.getExpire("user",TimeUnit.SECONDS)//根据key获取过期时间并换算成指定单位 stringRedisTemplate.delete("user");//根据key删除缓存stringRedisTemplate.hasKey("134");//检查key是否存在,返回boolean值 stringRedisTemplate.opsForSet().add("red", "black","blue","we");//向指定key中存放set集合stringRedisTemplate.expire("red",1000 , TimeUnit.MILLISECONDS);//设置过期时间stringRedisTemplate.opsForSet().isMember("red", "1")//根据key查看集合中是否存在指定数据stringRedisTemplate.opsForSet().members("red");//根据key获取set集合
案例
@Autowired private StringRedisTemplate stringRedisTemplate; @Test public void testRedis() throws Exception { stringRedisTemplate.opsForValue().set("key", "value"); System.out.println(stringRedisTemplate.opsForValue().get("key")); }
可以下载Redis可视化工具RedisDesktopManager查看数据
以上就是redisTemplate的使用以及和stringRedisTempalte的区别
记录学习,每天进步一点点的橘子大王。
喜欢就关注我吧。