Spring-Data-Redis

本文深入探讨Spring Data Redis框架,解析其如何简化Spring应用程序与Redis键值存储的交互,减少冗余代码,提供丰富的操作视图接口,包括Value、List、Set、ZSet和Hash操作。同时对比了spring-data-redis与jedis的使用方式,详细介绍了配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.   为什么使用Spring-Data-Redis

Spring Framework是领先的全套Java/JEE应用程序框架。它通过使用依赖注入,AOP和便携式服务抽象来提供轻量级的容器和非侵入式编程模型。

NoSQL存储器提供了用于水平可扩展性和速度的经典RDBMS的替代方案。在实现方面,KeyValue存储是NoSQL空间中最大(最老)的成员之一。

二.Spring-Data-Redis介绍

Spring-Data-Redis框架可以轻松地通过Spring的基础架构支持,消除使用Redis键值存储的Spring应用程序,从而减少与存储库进行交互所需的冗余代码。

Spring-data-redis是spring大家族的一部分,提供了在spring应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis,  JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。

 

三.redis与spring的整合一般分为spring-data-redis整合和jedis整合,先看看两者的区别

1、引用的依赖不同:

spring-data-redis使用的依赖如下:

 
  1. <dependency>

  2. <groupId>org.springframework.data</groupId>

  3. <artifactId>spring-data-redis</artifactId>

  4. <version>1.8.9.RELEASE</version>

  5. </dependency>

jedis使用的依赖如下:

 
  1. <dependency>

  2. <groupId>redis.clients</groupId>

  3. <artifactId>jedis</artifactId>

  4. <version>2.9.0</version>

  5. <type>jar</type>

  6. <scope>compile</scope>

  7. </dependency>

2.spring-data-redis的配置:

(1)构建Maven工程  SpringDataRedisDemo

(2)引入Spring相关依赖、引入JUnit依赖   (内容参加其它工程)

(3)引入Jedis和SpringDataRedis依赖

2>:在src/main/resources下创建properties文件夹,建立redis-config.properties

redis.host=127.0.0.1 

redis.port=6379 

redis.pass=

redis.database=0 

redis.maxIdle=300 

redis.maxWait=3000 

redis.testOnBorrow=true 

3>在src/main/resources下创建spring文件夹 ,创建applicationContext-redis.xml

<context:property-placeholder location="classpath*:properties/*.properties" />   

   <!-- redis 相关配置 --> 

   <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  

     <property name="maxIdle" value="${redis.maxIdle}" />   

     <property name="maxWaitMillis" value="${redis.maxWait}" />  

     <property name="testOnBorrow" value="${redis.testOnBorrow}" />  

   </bean>  

   <bean id="JedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 

       p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>  

   

   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">  

     <property name="connectionFactory" ref="JedisConnectionFactory" />  

   </bean>  

maxIdle :最大空闲数

maxWaitMillis:连接时的最大等待毫秒数

testOnBorrow:在提取一个jedis实例时,是否提前进行验证操作;如果为true,则得到的jedis实例均是可用的;

RedisTemplate介绍

spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。在RedisTemplate中提供了几个常用的接口方法的使用,分别是:

  • private ValueOperations<K, V> valueOps;
  • private ListOperations<K, V> listOps;
  • private SetOperations<K, V> setOps;
  • private ZSetOperations<K, V> zSetOps;
  • 下表是具体的操作视图接口类介绍:

    Key类型操作
    ValueOperationsRedis String/Value 操作
    ListOperationsRedis List 操作
    SetOperationsRedis Set 操作
    ZSetOperationsRedis Sort Set 操作
    HashOperationsRedis Hash 操作
    Value约束操作
    BoundValueOperationsRedis String/Value key 约束
    BoundListOperationsRedis List key 约束
    BoundSetOperationsRedis Set key 约束
    BoundZSetOperationsRedis Sort Set key 约束
    BoundHashOperationsRedis Hash key 约束

    在org.springframework.data.redis.core包中对表中的接口都提供了相应的默认实现

  1. 针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
    ValueOperations:简单K-V操作
    SetOperations:set类型数据操作
    ZSetOperations:zset类型数据操作
    HashOperations:针对map类型的数据操作

    ListOperations:针对list类型的数据操作

  • spring-Data-Redis的例子

  • @RunWith(SpringJUnit4ClassRunner.class)//让测试运行于Spring的JUnit4环境上

    @ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")//Spring整合JUnit4测试时,使用注解引入多个配置文件

    public class TestValue {

    @Autowired

    private RedisTemplate redisTemplate;

    @Test

    public void setValue(){

    redisTemplate.boundValueOps("name").set("cblue");

    }

    @Test

    public void getValue(){

    String str = (String) redisTemplate.boundValueOps("name").get();

    System.out.println(str);

    }

jedis方式:

通过redis.clients.jedis.JedisPool来管理,即通过池来管理,通过池对象获取jedis实例,然后通过jedis实例直接操作redis服务,剔除了与业务无关的冗余代码,如下面的代码片段:

 
  1. private JedisPool jedisPool;

  2.  
  3. public String save(String key,String val) {

  4. Jedis jedis = jedisPool.getResource();

  5. return jedis.set(key, val);

  6. }

从工厂类到池的方式变化,就相当于mybatis连接mysql方变化是一样的,代码变得更简洁,维护也更容易了。Jedis使用apache commons-pool2对Jedis资源池进行管理,所以在定义JedisPool时一个很重要的参数就是资源池GenericObjectPoolConfig,使用方式如下,其中有很多资源管理和使用的参数。

 

参数说明
JedisPool保证资源在一个可控范围内,并且提供了线程安全,但是一个合理的GenericObjectPoolConfig配置能为应用使用Redis保驾护航,下面将对它的一些重要参数进行说明和建议:

在当前环境下,Jedis连接就是资源,JedisPool管理的就是Jedis连接。
 

1. 资源设置和使用

maxTotal:资源池中最大连接数;默认值:8 设置建议见下节
maxIdle:资源池允许最大空闲的连接数;默认值:8;使用建议:设置建议见下节
minIdle:资源池确保最少空闲的连接数;默认值:0;使用建议:设置建议见下节
blockWhenExhausted:当资源池用尽后,调用者是否要等待。只有当为true时,下面的maxWaitMillis才会生效;默认值:true;使用建议:建议使用默认值
maxWaitMillis:当资源池连接用尽后,调用者的最大等待时间(单位为毫秒) -1:表示永不超时;使用建议:不建议使用默认值
testOnBorrow:向资源池借用连接时是否做连接有效性检测(ping),无效连接会被移除;默认值:false;使用建议:业务量很大时候建议设置为false(多一次ping的开销)。
testOnReturn:向资源池归还连接时是否做连接有效性检测(ping),无效连接会被移除;默认值:false;使用建议:业务量很大时候建议设置为false(多一次ping的开销)。
jmxEnabled:是否开启jmx监控,可用于监控;默认值:true;使用建议:建议开启,但应用本身也要开启

 

2.空闲资源监测

空闲Jedis对象检测,下面四个参数组合来完成,testWhileIdle是该功能的开关。

testWhileIdle:是否开启空闲资源监测;默认值:false;使用建议:true
timeBetweenEvictionRunsMillis:空闲资源的检测周期(单位为毫秒);默认值:-1:不检测;使用建议:建议设置,周期自行选择,也可以默认也可以使用下面JedisPoolConfig中的配置
minEvictableIdleTimeMillis:资源池中资源最小空闲时间(单位为毫秒),达到此值后空闲资源将被移除;默认值:1000 60 30 = 30分钟;使用建议:可根据自身业务决定,大部分默认值即可,也可以考虑使用下面JeidsPoolConfig中的配置

numTestsPerEvictionRun:做空闲资源检测时,每次的采样数;默认值:3;使用建议:可根据自身应用连接数进行微调,如果设置为-1,就是对所有连接做空闲监测

 

但是本文与spring集成并未直接采用JedisPool,而是采用了ShardedJedisPool,为什么呢?
因为ShardedJedisPool可以通过一致性哈希实现分布式存储。
 

 

四.RedisTemplate的作用

熟悉Spring的JdbcTemplate对象的话,应该大概能猜出来RedisTemplate的作用了,RedisTemplate对象对RedisConnection进行了封装,它提供了连接管理,序列化等功能,它对Redis的交互进行了更高层次的抽象。另外还提供了Redis操作命令的操作视图,这极大的方便和简化了Redis的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值