【redistemplate opsforvalue和boundValueOps】
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】相关推荐
- redistemplate opsforvalue和boundValueOps
Spring-data-redis操作redis知识总结 redistemplate opsforvalue和boundValueOps 什么是spring-data-redis spring-dat ...
- redisTemplate.opsForValue()中方法讲解
查看源码可以看到redisTemplate.opsForValue()中的方法都定义在ValueOperations<K, V> 中,该接口中一共有17个方法: public interf ...
- redistemplate.opsforvalue 设置不过期_民法典即将实施!“离婚冷静期”倍受关注
还有不到一个月,"离婚冷静期"就要落地了. 2021年1月1日起,<中华人民共和国民法典>(以下简称"<民法典>")将正式施行.作为与老 ...
- redistemplate hash 过期时间_redisTemplate的使用以及和stringRedisTemplate的区别
这两个类StringRedisTemplate和RedisTemplate,这两个类是springboot-data-redis对Redis进行操作的实现类. RedisTemplate是泛型类,而在 ...
- RedisTemplate中opsForValue和opsForList方法使用
一.opsForValue用法 key:字符串,value:可以是任意对象Object(例如String.具体对象如自定义类Student等),一个key只能对应一个value. 1)value为St ...
- RedisTemplate中opsForValue()中的方法
使用redisTemplate.opsForValue().set(); 先引入依赖 <dependency> <groupId>org.springframework.boo ...
- RedisTemplate常用集合使用说明-opsForValue(二)
基础配置介绍已经在前面的<RedisTemplate常用集合使用说明(一)>中已经介绍了,现在我们直接介绍opsForValue()方法的使用: 1.set(K key, V valu ...
- Redis存放短信验证码 RedisTemplate =>opsForValue
@Autowired private RedisTemplate redisTemplate; redisTemplate.opsForValue() redisTemplate.opsForHash ...
- RedisTemplate
Spring Boot中Jedis几个api返回值的确认 @RequestMapping("/del/{key}")public String del(@PathVariable( ...
最新文章
- 【原创】用户空间死循环导致memcached访问变慢问题排查
- 知识图谱学习笔记-PageRank
- 同步和异步GET,POST请求
- 10月编程语言排行榜,来了!
- Linux下精准踢掉登录用户-pkill命令
- java atlas mysql_使用Atlas实现MySQL读写分离+MySQL-(Master-Slave)配置
- Python自动化运维开发----基础(八)字符串
- 如何做到在职场中清楚有效的沟通,成为一个靠谱的职场人?
- 为什么开发人员应该学习 Kubernetes?
- [Android自定义控件] Android Scroller工具类和GestureDetector的简单用法
- Linux扫描工具rootkit部署
- (附源码)ssm财务管理系统 毕业设计 282251
- OFD发票无法打开了
- 新型安卓木马SpyNote生成器遭泄露
- 该设备正在使用中.请关闭可能使用该设备的所
- 2020年下半年教师资格幼儿园《综合素质》真题与参考答案
- C版的迷你程序——快速排序算法
- 【比赛回顾】广工2020程序设计决赛——排解忧伤
- ROS学习笔记(十三):Using Stamped datatypes with tf::MessageFilter
- 欧拉函数(dayn)
热门文章
- 关于在Win11任务栏隐藏输入法(中英文切换)图标的解决办法:
- HT1623驱动LCD段码屏程序
- torch和torchvision对应关系
- oracle sql 分页 很慢,一次分页SQL优化
- 0、Java项目开发环境搭建
- 子类父类的执行先后顺序
- 服务器机柜型号及技术参数
- crossover for android官方网,CROSSOVER Embedded Software
- 天地劫幽城再临服务器维护,天地劫幽城再临开服时间是什么时候_天地劫幽城再临开服时间一览_3DM手游...
- SecureCRT 8.5.4.1943 CRT中文版