• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

Spring极速集成注解redis实践

技术杂谈 勤劳的小蚂蚁 4个月前 (12-30) 90次浏览 已收录 0个评论 扫描二维码

Redis 做为基于内存的 Key-Value 数据库,用来做缓存服务器性价比相当高。官方推出的面向 Java 的 Client Jedis,提供了很多接口和方法,可以让 Java 操作使用 Redis。Spring 团队对 Jedis 进行了封装,独立为 spring-data-redis  项目,配合 spring 特性并集成 Jedis 的一些命令和方法。

本文重点描述集成过程,能让你迅速的通过 spring-data-redis 将 redis 集成到 spring 项目中,毕竟大家都忙的。

1. 添加项目依赖
<!–redis 缓存–>
<dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-redis</artifactId>
   <version>1.8.4.RELEASE</version>
</dependency>
<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>2.9.0</version>
</dependency>

2. 添加 spring-redis-context 配置
<?xml version=“1.0” encoding=“UTF-8”?>
      xsi:schemaLocation=http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                       http://www.springframework.org/schema/context
                       http://www.springframework.org/schema/context/spring-context.xsd”>
   <description>redis 相关类 Spring 托管</description>

   <!–载入 redis 配置文件–>
   <context:property-placeholderlocation=“classpath:redis.properties”ignore-unresolvable=“true”/>

   <!– 配置 JedisPoolConfig 实例 –>
   <beanid=“poolConfig”class=“redis.clients.jedis.JedisPoolConfig”>
       <propertyname=“maxIdle”value=“${redis.maxIdle}”/>
       <propertyname=“maxTotal”value=“${redis.maxActive}”/>
       <propertyname=“maxWaitMillis”value=“${redis.maxWait}”/>
       <propertyname=“testOnBorrow”value=“${redis.testOnBorrow}”/>
   </bean>

   <!– 配置JedisConnectionFactory –>
   <beanid=“jedisConnectionFactory”class=“org.springframework.data.redis.connection.jedis.JedisConnectionFactory”>
       <propertyname=“hostName”value=“${redis.host}”/>
       <propertyname=“port”value=“${redis.port}”/>
       <propertyname=“password”value=“${redis.pass}”/>
       <propertyname=“database”value=“${redis.dbIndex}”/>
       <propertyname=“poolConfig”ref=“poolConfig”/>
   </bean>

   <!– 配置RedisTemplate –>
   <beanid=“redisTemplate”class=“org.springframework.data.redis.core.RedisTemplate”>
       <propertyname=“connectionFactory”ref=“jedisConnectionFactory”/>
   </bean>

   <!– 配置RedisCacheManager –>
   <beanid=“redisCacheManager”class=“org.springframework.data.redis.cache.RedisCacheManager”>
       <constructor-argname=“redisOperations”ref=“redisTemplate”/>
       <propertyname=“defaultExpiration”value=“${redis.expiration}”/>
   </bean>

   <!– 配置RedisCacheConfig –>
   <beanid=“redisCacheConfig”class=“com.rambo.sdh.common.util.RedisCacheConfig”>
       <constructor-argref=“jedisConnectionFactory”/>
       <constructor-argref=“redisTemplate”/>
       <constructor-argref=“redisCacheManager”/>
   </bean>
</beans>

JedisConnectionFactory 为 Jedis 连接工厂,配置由单独抽象的 JedisPoolConfig 提供。如果你熟悉 Spring 的 JdbcTemplate 对象的话,这里大概能猜出来 RedisTemplate 的作用,RedisTemplate 对 RedisConnection 进行了封装。提供连接管理,序列化等功能,它对 Redis 的交互进行了更高层次的抽象,极大的方便和简化了 Redis 的操作。

RedisCacheManager 做为 redis 统一的调度和管理者,有兴趣可以反编译源码看看。继承自 org.springframework.cache.transaction.AbstractTransactionSupportingCacheManager 并实现 org.springframework.cache.CacheManager。

3. 添加 redis.properties
#============================#
#==== Redis settings ====#
#============================#
#redis 服务器 IP
redis.host=127.0.0.1

#redis 服务器端口
redis.port=6379

#redis 密码
redis.pass=redis#2017

#redis 支持16个数据库(相当于不同用户)可以使不同的应用程序数据彼此分开同时又存储在相同的实例上
redis.dbIndex=0

#redis 缓存数据过期时间单位秒
redis.expiration=3000

#控制一个 pool 最多有多少个状态为 idle 的jedis实例
redis.maxIdle=300

#控制一个 pool 可分配多少个jedis实例
redis.maxActive=600

#当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
redis.maxWait=1000

#在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
redis.testOnBorrow=true

当然配置文件你也可以硬编码到程序中,只是在参数发生改变的时候比较痛苦一点而已。其中大部分配置项都是围绕着 jedisPool ,如果你对数据库连接池比较熟,你会发现它俩的配置项有点相似。

当系统 redis 遇到问题出现故障时,理解这里的选项是个不错的选择,参考:

4. 编写自定义 redis 配置类
@Configuration
@EnableCaching
publicclassRedisCacheConfigextendsCachingConfigurerSupport{
   protectedfinalstatic Logger log = LoggerFactory.getLogger(RedisCacheConfig.class);

   privatevolatile JedisConnectionFactory mJedisConnectionFactory;
   privatevolatile RedisTemplate<String, String> mRedisTemplate;
   privatevolatile RedisCacheManager mRedisCacheManager;

   publicRedisCacheConfig(){
       super();
   }

   publicRedisCacheConfig(JedisConnectionFactory mJedisConnectionFactory, RedisTemplate<String, String> mRedisTemplate, RedisCacheManager mRedisCacheManager){
       super();
       this.mJedisConnectionFactory = mJedisConnectionFactory;
       this.mRedisTemplate = mRedisTemplate;
       this.mRedisCacheManager = mRedisCacheManager;
   }

   public JedisConnectionFactory redisConnectionFactory(){
       return mJedisConnectionFactory;
   }

   public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf){
       return mRedisTemplate;
   }

   public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate){
       return mRedisCacheManager;
   }

   @Bean
   public KeyGenerator keyGenerator(){
       returnnew KeyGenerator() {
           @Override
           public Object generate(Object o, Method method, Object… objects){
               StringBuilder sb = new StringBuilder();
               sb.append(o.getClass().getName());
               sb.append(method.getName());
               for (Object obj : objects) {
                   sb.append(obj.toString());
               }
               return sb.toString();
           }
       };
   }
}

该配置类继承自 org.springframework.cache.annotation.CachingConfigurerSupport 并实现org.springframework.cache.annotation.CachingConfigurer 的方法。通俗一点,该类告诉 spring 当前使用的缓存服务为 redis 并自定义了缓存 key 生成的规则。

5. 在你喜欢的地方进行注解缓存

缓存一般使用在服务层,在你想缓存的方法上面添加相应的注解即可,下面三个缓存的注解你得掌握。
  • @Cacheable  spring 会在其被调用后将返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。
  • @CachePut  标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
  • @CacheEvict 用来标注在需要清除缓存元素的方法或类上的。

当然这些注解里面还有很多其他的属性配置,配合 spring-el 表达式能做的事情还有很多,大概只有你想不到,没有做不到。

在业务规则比较复杂的情况下,缓存 key 的设计相当重要,设计出色可以使你的应用飞起来。

整个集成工作就结束了,是不是很简单,上述算是 redis 的冰山一角,还有很多像 redis 路由/分布式/集群….,有机会实践慢慢体会。



丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Spring极速集成注解redis实践
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00