最近在开始在学习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. Hadoop1.2.1 伪分布式安装

    Hadoop1.2.1 单机模式安装 Hadoop组件依赖图(从下往上看) 安装步骤: 详细步骤: 设置ssh自动登录(如下图): 1.输入命令 [ssh-keygen -t rsa],然后一直按回车 ...

  2. 【BZOJ3416】Poi2013 Take-out 栈

    [BZOJ3416]Poi2013 Take-out Description 小F喜欢玩一个消除游戏——take-out 保证k+1|n,保证输入数据有解这是一个单人游戏 游戏者的目标是消除初始时给定 ...

  3. Gson简要使用笔记(转载)

    经过比较,gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需 ...

  4. unicode转换中文

    <!doctype html><html lang="en"> <head>  <meta http-equiv="Refres ...

  5. Struts2中的拦截器详解

    exception:异常拦截器,拦截异常aliasservletConfig18nprepare:预备拦截器,这个拦截器就是为了ModelDriven准备对象的,若Action类实现了preparab ...

  6. 5501环路运输【(环结构)线性DP】【队列优化】

    5501 环路运输 0x50「动态规划」例题 描述 在一条环形公路旁均匀地分布着N座仓库,编号为1~N,编号为 i 的仓库与编号为 j 的仓库之间的距离定义为 dist(i,j)=min⁡(|i-j| ...

  7. SignalR循序渐进(二)泛型Hub

    接上一篇,文章末尾抛出了2个问题: 能不能让客户端声明一个强类型的方法列表呢?这样首先不容易写错. 同样的,能不能让服务端声明一个强类型的方法列表给客户端调用呢? 如果要让客户端的方法以强类型出现在服 ...

  8. Load Balancing with NGINX 负载均衡算法

    Using nginx as HTTP load balancer Using nginx as HTTP load balancer http://nginx.org/en/docs/http/lo ...

  9. kvm_read_guest*函数分析

    2017-06-30 在KVM中基于其搞特权及,可以透明的读写客户机的内存信息,为此KVM提供了一套API,这里姑且称之为kvm_read_guest_virt*/kvm_write_guest_vi ...

  10. MyEclipse 10的使用技巧

    默认快捷键 :Shift+Alt+s 然后选择generater getter and setter,这是快捷键.或者右键source里边有 generater getter and setter. ...