Spring 極速集成註解 redis 實踐

Redis 做為基於內存的 Key-Value 數據庫,用來做緩存服務器性價比相當高。

官方推出的面向 Java 的 Client Jedis,提供了很多接口和方法,可以讓 Java 操作使用 Redis。

Spring 團隊對 Jedis 進行了封裝,獨立為 spring-data-redis 項目,配合 spring 特性並集成 Jedis 的一些命令和方法。

本文重點描述集成過程,能讓你迅速的通過 spring-data-redis 將 redis 集成到 spring 項目中,畢竟大家都忙的。

1. 添加項目依賴


<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 配置


<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>

<property-placeholder>

<bean>
<property>
<property>
<property>
<property>
/<bean>

<bean>
<property>
<property>
<property>
<property>
<property>
/<bean>

<bean>
<property>
/<bean>

<bean>
<constructor-arg>
<property>
/<bean>

<bean>
<constructor-arg>
<constructor-arg>
<constructor-arg>
/<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
public class RedisCacheConfig extends CachingConfigurerSupport {
protected final static Logger log = LoggerFactory.getLogger(RedisCacheConfig.class);
private volatile JedisConnectionFactory mJedisConnectionFactory;
private volatile RedisTemplate<string> mRedisTemplate;
private volatile RedisCacheManager mRedisCacheManager;
public RedisCacheConfig() {
super();
}
public RedisCacheConfig(JedisConnectionFactory mJedisConnectionFactory, RedisTemplate<string> mRedisTemplate, RedisCacheManager mRedisCacheManager) {
super();
this.mJedisConnectionFactory = mJedisConnectionFactory;
this.mRedisTemplate = mRedisTemplate;
this.mRedisCacheManager = mRedisCacheManager;
}
public JedisConnectionFactory redisConnectionFactory() {
return mJedisConnectionFactory;
}
public RedisTemplate<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();
}
};
}
}
/<string>/<string>/<string>

該配置類繼承自 org.springframework.cache.annotation.CachingConfigurerSupport 並實現 org.springframework.cache.annotation.CachingConfigurer 的方法。

通俗一點,該類告訴 spring 當前使用的緩存服務為 redis 並自定義了緩存 key 生成的規則。

5. 在你喜歡的地方進行註解緩存

Spring 極速集成註解 redis 實踐

緩存一般使用在服務層,在你想緩存的方法上面添加相應的註解即可,下面三個緩存的註解你得掌握。

  • @Cacheable spring 會在其被調用後將返回值緩存起來,以保證下次利用同樣的參數來執行該方法時可以直接從緩存中獲取結果,而不需要再次執行該方法。
  • @CachePut 標註的方法在執行前不會去檢查緩存中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的緩存中。
  • @CacheEvict 用來標註在需要清除緩存元素的方法或類上的。
  • 當然這些註解裡面還有很多其他的屬性配置,配合 spring-el 表達式能做的事情還有很多,大概只有你想不到,沒有做不到。

在業務規則比較複雜的情況下,緩存 key 的設計相當重要,設計出色可以使你的應用飛起來。

整個集成工作就結束了,是不是很簡單,上述算是 redis 的冰山一角,還有很多像 redis 路由/分佈式/集群….,有機會實踐慢慢體會。

號外:小編為讀者蒐集了幾份最新教程,覆蓋了Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化等。

獲取方式:關注小編,並回復【資料】 領取。


分享到:


相關文章: