Spring-data-redis操作redis知识总结

什么是spring-data-redis

spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedis可以使用,像jdbc-redis,jredis也都属于redis的java客户端,他们之间是无法兼容的,如果你在一个项目中使用了jedis,然后后来决定弃用掉改用jdbc-redis就比较麻烦了,spring-data-redis提供了redis的java客户端的抽象,在开发中可以忽略掉切换具体的客户端所带来的影响,而且他本身就属于spring的一部分,比起单纯的使用jedis,更加稳定.管理起来更加自动化.(当然jedis的缺点不止以上).

spring-data-redis的特性

1.自动管理连接池,提供了一个高度封装的RedisTemplate类

2.针对jedis客户端的大量api进行了归类封装,把同一类型的操作封装成了Operation接口.支持redis中的五种数据类型的操作.

3.针对数据的"序列化与反序列化",提供了多种可以选择的策略(RedisSerializer)

​ JdkSerializationRedisSerializer:当需要存储java对象时使用.

​ StringRedisSerializer:当需要存储string类型的字符串时使用.

​ JacksonJsonRedisSerializer:将对象序列化成json的格式存储在redis中,需要jackson-json工具的支持,(目前我还没使用过,不了解)

Operations

redisTemplate有两个方法经常用到,一个是opsForXXX一个是boundXXXOps,XXX是value的类型,前者获取到一个Operation,但是没有指定操作的key,可以在一个连接(事务)内操作多个key以及对应的value;后者会获取到一个指定了key的operation,在一个连接内只操作这个key对应的value.

ValueOperation和BoundValueOperation

ValueOperations valueOperations = redisTemplate.opsForValue();

BoundValueOperations<String, User> boundValueOps = redisTemplate.boundValueOps(“key”);

ValueOperation可以缓存Integer,String,java对象等类型.使用.set(key,value)方法进行设置,get(key)方法用来获取.

同样的方式可以获取ListOperations对象,可以用来缓存List,此外还有SetOperation,HashOperation

在spring+springmvc项目中使用spring-data-redis

1.maven配置,添加pom依赖

 1 <dependency>2      <groupId>org.springframework.data</groupId>3      <artifactId>spring-data-redis</artifactId>4      <version>1.3.4.RELEASE</version>5 </dependency>6 7 <dependency>8      <groupId>redis.clients</groupId>9      <artifactId>jedis</artifactId>
10      <version>2.4.2</version>
11 </dependency>

2.spring-redis.xml配置:

 <!--JedisPoolConfig 连接池参数配置--><bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"><!--最大空闲实例数--><property name="maxIdle" value="300" /><!--最大活跃实例数--><property name="maxTotal" value="600" /><!--创建实例时最长等待时间--><property name="maxWaitMillis" value="1000" /><!--创建实例时是否验证--><property name="testOnBorrow" value="true" /></bean><!--JedisConnectionFactory 跟配置数据库连接池类似,需要配置JedisConnectionFactory来通过服务器或者连接池的方式获取redis服务器的连接--><bean id="connectionFactory"class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><property name="hostName" value="127.0.0.1"/><property name="port" value="6379"/><property name="usePool" value="true"/><property name="poolConfig" ref="poolConfig"/></bean><bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/><bean id="valueSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/><!-- redis模板配置  spring-data-redis提供了一个基础的泛型RedisTemplate封装了基础的crud操作--><bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"><property name="connectionFactory" ref="connectionFactory"/><property name="defaultSerializer" ref="stringRedisSerializer"/><property name="keySerializer" ref="stringRedisSerializer"/><property name="valueSerializer" ref="valueSerializer"/></bean>

​ 以上配置完成后,就可以使用spring-data-redis了,为了演示一下具体的使用,这里接着写一个简单地demo.

3.创建实体类User

 1 public class User implements Serializable {2 3     private static final long serialVersionUID = 1L;4 5     /** 用户ID */6     private Long id;7 8     /** 用户名 */9     private String name;
10
11     /** 用户年龄 */
12     private Integer age;
13 }

​ 注意:如果需要向redis内存储pojo对象,那么该对象必须要实现Serializable接口,因为在redis中存储pojo类仍然存储的是string,它会把数据转化成byte[]数组的形式,在存取的时候就要对数据格式进行转化,就涉及到了序列化与反序列化.

4.创建UserCcontroller

@Controller
public class UserController extends BaseController {@Autowiredprivate IUserService userService;@Autowiredprivate RedisTemplate<String,User> redisTemplate;@ResponseBody@RequestMapping("/redis")public Object redis() {User u1=new User();u1.setId(1L);u1.setName("wang");u1.setAge(22);redisTemplate.opsForValue().set("user:wang",u1);User u2=redisTemplate.opsForValue().get("user:wang");return u2;}
}

这里我们将user对象存储到redis中,再读出来,运行项目,测试这个接口,就可以在浏览器中看到json格式的user对象.

常见报错及解决方案

最开始我测试spring-data-redis的功能是从一个空项目一点点配置的,启动时报了很多异常,下面一个一个来.

1.启动tomcat报错
Caused by: java.lang.VerifyError: (class: org/springframework/data/redis/connection/jedis/JedisConnectionFactory,
method: afterPropertiesSet signature: ()V) Incompatible argument to function

原因及解决方案:

​ 在pom中我最开始配置的jedis版本是2.7.3,spring-data-redis版本是1.1.1,网上搜索了一翻,发现有一个说法是jedis-2.7.3.jar 和 spring-data-redis-1.1.1.RELEASE.jar 无法搭配使用,于是我把spring-data-redis的版本设成比较高的1.3.4,重新部署,果然此问题解决,紧接着问题又来了.

2.启动tomcat报错

Caused by: Java.lang.NoSuchMethodError: redis.clients.jedis.JedisShardInfo.setTimeout(I)V

原因及解决方案:同样是版本的问题(没错,都被我撞上了),jedis版本是2.7.3,太高了,改成2.4.3以后,问题解决.

3.启动tomcat报错

java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool

原因及解决方案:这个GenericObjectPool使用到了commons-pool.jar中的类,我们的依赖中没有这个jar,所以添加commons-pool的dependency即可.

4.运行接口报错

HTTP Status 500 - Request processing failed; nested exception is java.lang.ClassCastException: com.baomidou.springmvc.model.system.User cannot be cast to java.lang.String

原因及解决方案:在spring-redis配置文件中的redisTemplate的property中缺少name="valueSerializer"的配置,因为存储在redis的value是user对象,需要使用JdkSerializationRedisSerializer对象进行对象的序列化操作,解决方案就是配置成上面spring-redis.xml的方式.

【redistemplate opsforvalue和boundValueOps】相关推荐

  1. redistemplate opsforvalue和boundValueOps

    Spring-data-redis操作redis知识总结 redistemplate opsforvalue和boundValueOps 什么是spring-data-redis spring-dat ...

  2. redisTemplate.opsForValue()中方法讲解

    查看源码可以看到redisTemplate.opsForValue()中的方法都定义在ValueOperations<K, V> 中,该接口中一共有17个方法: public interf ...

  3. redistemplate.opsforvalue 设置不过期_民法典即将实施!“离婚冷静期”倍受关注

    还有不到一个月,"离婚冷静期"就要落地了. 2021年1月1日起,<中华人民共和国民法典>(以下简称"<民法典>")将正式施行.作为与老 ...

  4. redistemplate hash 过期时间_redisTemplate的使用以及和stringRedisTemplate的区别

    这两个类StringRedisTemplate和RedisTemplate,这两个类是springboot-data-redis对Redis进行操作的实现类. RedisTemplate是泛型类,而在 ...

  5. RedisTemplate中opsForValue和opsForList方法使用

    一.opsForValue用法 key:字符串,value:可以是任意对象Object(例如String.具体对象如自定义类Student等),一个key只能对应一个value. 1)value为St ...

  6. RedisTemplate中opsForValue()中的方法

    使用redisTemplate.opsForValue().set(); 先引入依赖 <dependency> <groupId>org.springframework.boo ...

  7. RedisTemplate常用集合使用说明-opsForValue(二)

    ​ 基础配置介绍已经在前面的<RedisTemplate常用集合使用说明(一)>中已经介绍了,现在我们直接介绍opsForValue()方法的使用: 1.set(K key, V valu ...

  8. Redis存放短信验证码 RedisTemplate =>opsForValue

    @Autowired private RedisTemplate redisTemplate; redisTemplate.opsForValue() redisTemplate.opsForHash ...

  9. RedisTemplate

    Spring Boot中Jedis几个api返回值的确认 @RequestMapping("/del/{key}")public String del(@PathVariable( ...

最新文章

  1. 数据库授予用户增删改查的权限的语句_软件测试之浅谈数据库技术概述
  2. 第一个Struts2程序
  3. 模块定义文件导出类_浓缩的就是精华——ES6模块精炼讲解
  4. Oracle-11g 基于 NBU 的 rman 冷备份及恢复
  5. 休息是为了更好的出发
  6. 计算机的智能化研究领域的是,科学网—第五代计算机为何在“智能化”阶段的发展像蜗牛般的徘徊前行? - 邹晓辉的博文...
  7. css如何让两个div上下排列_CSS层叠上下文
  8. 按工作日加减天数,忽略星期六日
  9. 基于Cocos2d-x开发guardCarrot--2 《保卫萝卜2》主页面开发
  10. QT 控件动态效果之QPropertyAnimation
  11. ddr4单颗粒最大_国产DDR4内存颗粒!南亚DDR4颗粒超频测试
  12. C/C++指针的经典笔试面试题
  13. 多项式插值中的一些定理证明
  14. 微信分享解决wx not defined
  15. UTF8与GBK字符编码转换
  16. 笛卡尔坐标系中八个卦限对应的位置
  17. mysql怎么增加内存_MySQL内存不足怎么办
  18. Best Time to Buy and Sell Stock I II III IV (第四周 动态规划)
  19. 织梦(DEDECMS)系统网站搬家技巧-dedeCms换空间搬家教
  20. 拓扑图介绍及相关功能

热门文章

  1. 【API网关】Kong安装和基本操作
  2. Redis知识点总结
  3. 16、Java 基础-反射
  4. mysql 安顺寻_爱心传递|这16名被拐或走失的孩子,9月2日将到安顺寻亲!请大家帮他们找到家人!...
  5. Python 实例 - Day3 - Spirograph 万花尺(完结)
  6. Intellij IDEA 最新旗舰版注册激活破解(2018亲测,可用)
  7. 悦刻母公司雾芯季报图解:营收10.4亿同比降38% 净利5亿
  8. MySQL 使用sql添加和创建用户
  9. SpringBoot+Vue项目便捷洗衣服务平台
  10. python蟒蛇绘制文字_【Python】蟒蛇绘制