詳解Spring極速集成注解redis實錄
Redis 做為基于內(nèi)存的 Key-Value 數(shù)據(jù)庫,用來做緩存服務(wù)器性價比相當(dāng)高。
官方推出的面向 Java 的 Client Jedis,提供了很多接口和方法,可以讓 Java 操作使用 Redis。
Spring Data Redis 為 Spring 團(tuán)隊對 Jedis 進(jìn)行了封裝,集成 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"?>
<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 相關(guān)類 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 連接工廠,配置由單獨(dú)抽象的 JedisPoolConfig 提供。
如果你熟悉 Spring 的 JdbcTemplate 對象的話,這里大概能猜出來 RedisTemplate 的作用,RedisTemplate 對 RedisConnection 進(jìn)行了封裝。
提供連接管理,序列化等功能,它對 Redis 的交互進(jìn)行了更高層次的抽象,極大的方便和簡化了 Redis 的操作。
RedisCacheManager 做為 redis 統(tǒng)一的調(diào)度和管理者,有興趣可以反編譯源碼看看。
繼承自 org.springframework.cache.transaction.AbstractTransactionSupportingCacheManager 并實現(xiàn) org.springframework.cache.CacheManager。
3. 添加 redis.properties
#============================# #==== Redis settings ====# #============================# #redis 服務(wù)器 IP redis.host=127.0.0.1 #redis 服務(wù)器端口 redis.port=6379 #redis 密碼 redis.pass=redis#2017 #redis 支持16個數(shù)據(jù)庫(相當(dāng)于不同用戶)可以使不同的應(yīng)用程序數(shù)據(jù)彼此分開同時又存儲在相同的實例上 redis.dbIndex=0 #redis 緩存數(shù)據(jù)過期時間單位秒 redis.expiration=3000 #控制一個 pool 最多有多少個狀態(tài)為 idle 的jedis實例 redis.maxIdle=300 #控制一個 pool 可分配多少個jedis實例 redis.maxActive=600 #當(dāng)borrow一個jedis實例時,最大的等待時間,如果超過等待時間,則直接拋出JedisConnectionException; redis.maxWait=1000 #在borrow一個jedis實例時,是否提前進(jìn)行alidate操作;如果為true,則得到的jedis實例均是可用的; redis.testOnBorrow=true
當(dāng)然配置文件你也可以硬編碼到程序中,只是在參數(shù)發(fā)生改變的時候比較痛苦一點而已。
其中大部分配置項都是圍繞著 jedisPool ,如果你對數(shù)據(jù)庫連接池比較熟,你會發(fā)現(xiàn)它倆的配置項有點相似。
當(dāng)系統(tǒng) redis 遇到問題出現(xiàn)故障時,理解這里的選項是個不錯的選擇。
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, 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 并實現(xiàn) org.springframework.cache.annotation.CachingConfigurer 的方法。
通俗一點,該類告訴 spring 當(dāng)前使用的緩存服務(wù)為 redis 并自定義了緩存 key 生成的規(guī)則。
5. 在你喜歡的地方進(jìn)行注解緩存

緩存一般使用在服務(wù)層,在你想緩存的方法上面添加相應(yīng)的注解即可,下面三個緩存的注解你得掌握。
@Cacheable spring 會在其被調(diào)用后將返回值緩存起來,以保證下次利用同樣的參數(shù)來執(zhí)行該方法時可以直接從緩存中獲取結(jié)果,而不需要再次執(zhí)行該方法。
@CachePut 標(biāo)注的方法在執(zhí)行前不會去檢查緩存中是否存在之前執(zhí)行過的結(jié)果,而是每次都會執(zhí)行該方法,并將執(zhí)行結(jié)果以鍵值對的形式存入指定的緩存中。
@CacheEvict 用來標(biāo)注在需要清除緩存元素的方法或類上的。
當(dāng)然這些注解里面還有很多其他的屬性配置,配合 spring-el 表達(dá)式能做的事情還有很多,大概只有你想不到,沒有做不到。
在業(yè)務(wù)規(guī)則比較復(fù)雜的情況下,緩存 key 的設(shè)計相當(dāng)重要,設(shè)計出色可以使你的應(yīng)用飛起來。
整個集成工作就結(jié)束了,是不是很簡單,上述算是 redis 的冰山一角,還有很多像 redis 路由/分布式/集群....,有機(jī)會實踐慢慢體會。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合Swagger Api自動生成文檔的實現(xiàn)
本文主要介紹了SpringBoot整合Swagger Api自動生成文檔的實,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
MybatisPlus EntityWrapper如何自定義SQL
這篇文章主要介紹了MybatisPlus EntityWrapper如何自定義SQL,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Spring使用RestTemplate和Junit單元測試的注意事項
這篇文章主要介紹了Spring使用RestTemplate和Junit單元測試的注意事項,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Java用BigDecimal類解決Double類型精度丟失的問題
這篇文章主要介紹了Java用BigDecimal類解決Double類型精度丟失的問題,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12
Java如何使用httpclient檢測url狀態(tài)及鏈接是否能打開
這篇文章主要介紹了Java如何使用httpclient檢測url狀態(tài)及鏈接是否能打開,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

