最近在开始在学习Redis以及如何在Java当中去使用Redis,Redis是什么我这里就不说了。

我主要想说的是Redis和Java当中Spring结合起来的时候,使用到的RedisTemplate和StringRedisTemplate

他们两者之间的区别,以及该怎么使用。

RedisTemplate看这个类的名字后缀是Template,如果了解过Spring如何连接关系型数据库的,大概不会难猜出这个类
是做什么的 ,它跟JdbcTemplate一样封装了对Redis的一些常用的操作,当然StringRedisTemplate跟RedisTemplate功能类似
那么肯定就会有人问,为什么会需要两个Template呢,一个不就够了吗?
其实他们两者之间的区别主要在于他们使用的序列化类。
RedisTemplate使用的是JdkSerializationRedisSerializer
StringRedisTemplate使用的是StringRedisSerializer
 
RedisTemplate使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组
然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式
展现的,而是以字节数组显示,类似下面

当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这样就会导致一个问题,当需要获取的
数据不是以字节数组存在redis当中而是正常的可读的字符串的时候,比如说下面这种形式的数据
注:使用的软件是RedisDesktopManager
RedisTemplate就无法获取导数据,这个时候
获取到的值就是NULL。这个时候StringRedisTempate就派上了用场
 
当Redis当中的数据值是以可读的形式显示出来的时候,只能使用StringRedisTemplate才能获取到里面的数据。
所以当你使用RedisTemplate获取不到数据的时候请检查一下是不是Redis里面的数据是可读形式而非字节数组
 
另外我在测试的时候即使把StringRedisTemplate的序列化类修改成RedisTemplate的JdkSerializationRedisSerializer
最后还是无法获取被序列化的对象数据,即使是没有转化为对象的字节数组,代码如下
  1. @Test
  2. public void testRedisSerializer(){
  3. User u = new User();
  4. u.setName("java");
  5. u.setSex("male");
  6. redisTemplate.opsForHash().put("user:","1",u);
  7. /*查看redisTemplate 的Serializer*/
  8. System.out.println(redisTemplate.getKeySerializer());
  9. System.out.println(redisTemplate.getValueSerializer());
  10. /*查看StringRedisTemplate 的Serializer*/
  11. System.out.println(stringRedisTemplate.getValueSerializer());
  12. System.out.println(stringRedisTemplate.getValueSerializer());
  13. /*将stringRedisTemplate序列化类设置成RedisTemplate的序列化类*/
  14. stringRedisTemplate.setKeySerializer(new JdkSerializationRedisSerializer());
  15. stringRedisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
  16. /*即使在更换stringRedisTemplate的的Serializer和redisTemplate一致的
  17. * JdkSerializationRedisSerializer
  18. * 最后还是无法从redis中获取序列化的数据
  19. * */
  20. System.out.println(stringRedisTemplate.getValueSerializer());
  21. System.out.println(stringRedisTemplate.getValueSerializer());
  22. User user = (User)  redisTemplate.opsForHash().get("user:","1");
  23. User  user2 = (User) stringRedisTemplate.opsForHash().get("user:","1");
  24. System.out.println("dsd");
  25. }






Debug结果
 
总结:
当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可,
但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是
更好的选择。
附注:
这个段代码代码使用的Spring和Junit测试的,具体配置文件和其他代码见

RedisTemplate和StringRedisTemplate的更多相关文章

  1. springboot系列十一、redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较

    一.redisTemplate和stringRedisTemplate对比 RedisTemplate看这个类的名字后缀是Template,如果了解过Spring如何连接关系型数据库的,大概不会难猜出 ...

  2. 关于RedisTemplate和StringRedisTemplate(转)

    最近在开始在学习Redis以及如何在Java当中去使用Redis,Redis是什么我这里就不说了. 我主要想说的是Redis和Java当中Spring结合起来的时候,使用到的RedisTemplate ...

  3. RedisTemplate和StringRedisTemplate的区别

    今天springboot项目中用redis的时候,遇到了一个问题,用RedisTemplate这个类向redis中存储数据的时候,明明数据存进去了,也可以取出来,但是rdm就是看不到key的值,网上的 ...

  4. Spring boot使用Redis时,报错,有redisTemplate和stringRedisTemplate两个bean?

    Error starting ApplicationContext. To display the auto-configuration report re-run your application ...

  5. springmvc Cacheable (RedisTemplate / StringRedisTemplate)

    直接使用spring缓存请见:https://www.cnblogs.com/hanjun0612/p/11661340.html RedisTemplate和StringRedisTemplate配 ...

  6. spring mvc Spring Data Redis RedisTemplate [转]

    http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...

  7. Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

    一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...

  8. Spring StringRedisTemplate 配置

    1 先看pom.xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>c ...

  9. RedisTemplate使用

    RedisTemplate中定义了对5种数据结构操作 redisTemplate.opsForValue();//操作字符串 redisTemplate.opsForHash();//操作hash r ...

随机推荐

  1. Spring_day02--log4j介绍_Spring整合web项目演示

    log4j介绍 1 通过log4j可以看到程序运行过程中更详细的信息 (1)经常使用log4j查看日志 2 使用 (1)导入log4j的jar包 (2)复制log4j的配置文件,复制到src下面 3 ...

  2. Struts2_day02--课程安排_结果页面配置

    Struts2_day02 上节内容 今天内容 结果页面配置 全局结果页面 局部结果页面 Result标签的type属性 Action获取表单提交数据 使用ActionContext类获取 使用Ser ...

  3. 适配iOS 8备忘录 开始启动(持续更新。。。1130)

    本文转载至 http://www.cocoachina.com/bbs/read.php?tid=229352 PS:大家都说看到那么多图标很头痛,我来给大家解决这个问题:直接下载我的这个包Image ...

  4. 3 differences between Savepoints and Checkpoints in Apache Flink

    https://mp.weixin.qq.com/s/nQOxsZUZSiPi7Sx40mgwsA 20181104 3 differences between Savepoints and Chec ...

  5. Spark Streaming Programming Guide

    参考,http://spark.incubator.apache.org/docs/latest/streaming-programming-guide.html Overview SparkStre ...

  6. python基础-第八篇-8.1初识Socket

    socket基础 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. so ...

  7. Python高级特性(2):Closures、Decorators和functools(转)

    原文:Python高级特性(2):Closures.Decorators和functools 装饰器(Decorators) 装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过 ...

  8. Flask之flask-session

    简介 flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis:保存数 ...

  9. Pycharm建立web2py项目并简单连接MySQL数据库

    引言 web2py是一种免费的,开源的web开发框架,用于敏捷地开发安全的,数据库驱动的web应用:web2p采用Python语言编写,并且可以使用Python编程.web2py是一个完整的堆栈框架, ...

  10. 001-hive是什么

    一.基本概念 官网含义:https://cwiki.apache.org/confluence/display/Hive/Home The Apache Hive™ data warehouse so ...