欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-31 15:35:22
什么是spring-data-redis spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对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的类型,前者获取到一个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的方式.

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