cnblogs.com/java-class/p/7112541.html
Redis 做为基于内存的 Key-Value 数据库,用来做缓存服务器性价比相当高。
官方推出的面向 Java 的 Client Jedis,提供了很多接口和方法,可以让 Java 操作使用 Redis。
Spring 团队对 Jedis 进行了封装,独立为 spring-data-redis 项目,配合 spring 特性并集成 Jedis 的一些命令和方法。
本文重点描述集成过程,能让你迅速的通过 spring-data-redis 将 redis 集成到 spring 项目中,毕竟大家都忙的。
1. 添加项目依赖
!--redis 缓存--
dependency
groupIdorg.springframework.data/groupId
artifactIdspring-data-redis/artifactId
version1.8.4.RELEASE/version
/dependency
dependency
groupIdredis.clients/groupId
artifactIdjedis/artifactId
version2.9.0/version
/dependency
2. 添加 spring-redis-context 配置
?xml version="1.0" encoding="UTF-8"?
beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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"
descriptionredis 相关类 Spring 托管/description
!--载入 redis 配置文件--
context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/
!-- 配置 JedisPoolConfig 实例 --
bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"
property name="maxIdle" value="${redis.maxIdle}"/
property name="maxTotal" value="${redis.maxActive}"/
property name="maxWaitMillis" value="${redis.maxWait}"/
property name="testOnBorrow" value="${redis.testOnBorrow}"/
/bean
!-- 配置JedisConnectionFactory --
bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
property name="hostName" value="${redis.host}"/
property name="port" value="${redis.port}"/
property name="password" value="${redis.pass}"/
property name="database" value="${redis.dbIndex}"/
property name="poolConfig" ref="poolConfig"/
/bean
!-- 配置RedisTemplate --
bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
property name="connectionFactory" ref="jedisConnectionFactory"/
/bean
!-- 配置RedisCacheManager --
bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"
constructor-arg name="redisOperations" ref="redisTemplate"/
property name="defaultExpiration" value="${redis.expiration}"/
/bean
!-- 配置RedisCacheConfig --
bean id="redisCacheConfig" class="com.rambo.sdh.common.util.RedisCacheConfig"
constructor-arg ref="jedisConnectionFactory"/
constructor-arg ref="redisTemplate"/
constructor-arg ref="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 遇到问题出现故障时,理解这里的选项是个不错的选择。
更多配置项详解:
http://www.2cto.com/database/201311/254449.html
4. 编写自定义 redis 配置类
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {
protected final static Logger log = LoggerFactory.getLogger(RedisCacheConfig.class);
private volatile JedisConnectionFactory mJedisConnectionFactory;
private volatile RedisTemplateString, String mRedisTemplate;
private volatile RedisCacheManager mRedisCacheManager;
public RedisCacheConfig() {
super();
}
public RedisCacheConfig(JedisConnectionFactory mJedisConnectionFactory, RedisTemplateString, String mRedisTemplate, RedisCacheManager mRedisCacheManager) {
super();
this.mJedisConnectionFactory = mJedisConnectionFactory;
this.mRedisTemplate = mRedisTemplate;
this.mRedisCacheManager = mRedisCacheManager;
}
public JedisConnectionFactory redisConnectionFactory() {
return mJedisConnectionFactory;
}
public RedisTemplateString, String redisTemplate(RedisConnectionFactory cf) {
return mRedisTemplate;
}
public CacheManager cacheManager(RedisTemplate?, ? redisTemplate) {
return mRedisCacheManager;
}
@Bean
public KeyGenerator keyGenerator() {
return new 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. 在你喜欢的地方进行注解缓存
缓存一般使用在服务层,在你想缓存的方法上面添加相应的注解即可,下面三个缓存的注解你得掌握。
当然这些注解里面还有很多其他的属性配置,配合 spring-el 表达式能做的事情还有很多,大概只有你想不到,没有做不到。
在业务规则比较复杂的情况下,缓存 key 的设计相当重要,设计出色可以使你的应用飞起来。
整个集成工作就结束了,是不是很简单,上述算是 redis 的冰山一角,还有很多像 redis 路由/分布式/集群….,有机会实践慢慢体会。
如果你觉得文章有用,欢迎点赞分享到朋友圈
原文始发于微信公众号(后端技术精选):