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

发布时间 - 2026-01-11 00:39:30    点击率:

什么是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的类型,前者获取到一个Opercation,但是没有指定操作的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依赖

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-redis</artifactId>
  <version>1.3.4.RELEASE</version>
</dependency>

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>2.4.2</version>
</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

public class User implements Serializable {

 private static final long serialVersionUID = 1L;

 /** 用户ID */
 private Long id;

 /** 用户名 */
 private String name;

 /** 用户年龄 */
 private Integer age;
}

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

4.创建UserCcontroller

@Controller
public class UserController extends BaseController {

 @Autowired
 private IUserService userService;

 @Autowired
 private 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的方式.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring  # data  # redis 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  如何快速生成橙子建站落地页链接?  高端网站建设与定制开发一站式解决方案 中企动力  Laravel如何处理文件下载请求?(Response示例)  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  python中快速进行多个字符替换的方法小结  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel如何实现API版本控制_Laravel版本化API设计方案  如何基于云服务器快速搭建个人网站?  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Linux网络带宽限制_tc配置实践解析【教程】  简历在线制作网站免费版,如何创建个人简历?  如何在橙子建站中快速调整背景颜色?  大同网页,大同瑞慈医院官网?  Laravel如何处理异常和错误?(Handler示例)  微信小程序 闭包写法详细介绍  详解Huffman编码算法之Java实现  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  LinuxShell函数封装方法_脚本复用设计思路【教程】  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  网站建设整体流程解析,建站其实很容易!  打造顶配客厅影院,这份100寸电视推荐名单请查收  桂林网站制作公司有哪些,桂林马拉松怎么报名?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  如何在万网开始建站?分步指南解析  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何在云虚拟主机上快速搭建个人网站?  JavaScript如何实现继承_有哪些常用方法  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  使用spring连接及操作mongodb3.0实例  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel如何实现本地化和多语言支持?(i18n教程)  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  ,南京靠谱的征婚网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  JavaScript如何操作视频_媒体API怎么控制播放  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程