Redis 作爲基於內存的 Key-Value 數據庫,用來作緩存服務器性價比至關高。redis
官方推出的面向 Java 的 Client Jedis,提供了不少接口和方法,可讓 Java 操做使用 Redis。spring
Spring 團隊對 Jedis 進行了封裝,獨立爲 spring-data-redis 項目,配合 spring 特性並集成 Jedis 的一些命令和方法。數據庫
本文重點描述集成過程,能讓你迅速的經過 spring-data-redis 將 redis 集成到 spring 項目中,畢竟你們都忙的。緩存
<!--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>
複製代碼
<?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">
<description>redis 相關類 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 提供。bash
若是你熟悉 Spring 的 JdbcTemplate 對象的話,這裏大概能猜出來 RedisTemplate 的做用,RedisTemplate 對 RedisConnection 進行了封裝。服務器
提供鏈接管理,序列化等功能,它對 Redis 的交互進行了更高層次的抽象,極大的方便和簡化了 Redis 的操做。app
RedisCacheManager 作爲 redis 統一的調度和管理者,有興趣能夠反編譯源碼看看。分佈式
繼承自 org.springframework.cache.transaction.AbstractTransactionSupportingCacheManager 並實現 org.springframework.cache.CacheManager。ide
#============================#
#==== 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
複製代碼
固然配置文件你也能夠硬編碼到程序中,只是在參數發生改變的時候比較痛苦一點而已。ui
其中大部分配置項都是圍繞着 jedisPool ,若是你對數據庫鏈接池比較熟,你會發現它倆的配置項有點類似。
當系統 redis 遇到問題出現故障時,理解這裏的選項是個不錯的選擇。
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {
protected final static Logger log = LoggerFactory.getLogger(RedisCacheConfig.class);
private volatile JedisConnectionFactory mJedisConnectionFactory;
private volatile RedisTemplate<String, String> mRedisTemplate;
private volatile RedisCacheManager mRedisCacheManager;
public RedisCacheConfig() {
super();
}
public RedisCacheConfig(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() {
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 生成的規則。
在業務規則比較複雜的狀況下,緩存 key 的設計至關重要,設計出色可使你的應用飛起來。
整個集成工做就結束了,是否是很簡單,上述算是 redis 的冰山一角,還有不少像 redis 路由/分佈式/集羣….,有機會實踐慢慢體會。