閱讀目錄
Redis 做為基于內(nèi)存的 Key-Value 數(shù)據(jù)庫(kù),用來(lái)做緩存服務(wù)器性價(jià)比相當(dāng)高。
官方推出的面向 Java 的 Client Jedis,提供了很多接口和方法,可以讓 Java 操作使用 Redis。
Spring 團(tuán)隊(duì)對(duì) Jedis 進(jìn)行了封裝,獨(dú)立為 spring-data-redis 項(xiàng)目,配合 spring 特性并集成 Jedis 的一些命令和方法。
本文重點(diǎn)描述集成過(guò)程,能讓你迅速的通過(guò) spring-data-redis 將 redis 集成到 spring 項(xiàng)目中,畢竟大家都忙的。
1. 添加項(xiàng)目依賴
<!--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 實(shí)例 --> <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 對(duì)象的話,這里大概能猜出來(lái) RedisTemplate 的作用,RedisTemplate 對(duì) RedisConnection 進(jìn)行了封裝。
提供連接管理,序列化等功能,它對(duì) Redis 的交互進(jìn)行了更高層次的抽象,極大的方便和簡(jiǎn)化了 Redis 的操作。
RedisCacheManager 做為 redis 統(tǒng)一的調(diào)度和管理者,有興趣可以反編譯源碼看看。
繼承自 org.springframework.cache.transaction.AbstractTransactionSupportingCacheManager 并實(shí)現(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個(gè)數(shù)據(jù)庫(kù)(相當(dāng)于不同用戶)可以使不同的應(yīng)用程序數(shù)據(jù)彼此分開同時(shí)又存儲(chǔ)在相同的實(shí)例上 redis.dbIndex=0 #redis 緩存數(shù)據(jù)過(guò)期時(shí)間單位秒 redis.expiration=3000 #控制一個(gè) pool 最多有多少個(gè)狀態(tài)為 idle 的jedis實(shí)例 redis.maxIdle=300 #控制一個(gè) pool 可分配多少個(gè)jedis實(shí)例 redis.maxActive=600 #當(dāng)borrow一個(gè)jedis實(shí)例時(shí),最大的等待時(shí)間,如果超過(guò)等待時(shí)間,則直接拋出JedisConnectionException; redis.maxWait=1000 #在borrow一個(gè)jedis實(shí)例時(shí),是否提前進(jìn)行alidate操作;如果為true,則得到的jedis實(shí)例均是可用的; redis.testOnBorrow=true
當(dāng)然配置文件你也可以硬編碼到程序中,只是在參數(shù)發(fā)生改變的時(shí)候比較痛苦一點(diǎn)而已。
其中大部分配置項(xiàng)都是圍繞著 jedisPool ,如果你對(duì)數(shù)據(jù)庫(kù)連接池比較熟,你會(huì)發(fā)現(xiàn)它倆的配置項(xiàng)有點(diǎn)相似。
當(dāng)系統(tǒng) redis 遇到問(wèn)題出現(xiàn)故障時(shí),理解這里的選項(xiàng)是個(gè)不錯(cuò)的選擇,更多配置項(xiàng)詳解。
4. 編寫自定義 redis 配置類
@Configuration @EnableCachingpublic 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 并實(shí)現(xiàn) org.springframework.cache.annotation.CachingConfigurer 的方法。
通俗一點(diǎn),該類告訴 spring 當(dāng)前使用的緩存服務(wù)為 redis 并自定義了緩存 key 生成的規(guī)則。
5. 在你喜歡的地方進(jìn)行注解緩存
緩存一般使用在服務(wù)層,在你想緩存的方法上面添加相應(yīng)的注解即可,下面三個(gè)緩存的注解你得掌握。
@Cacheable spring 會(huì)在其被調(diào)用后將返回值緩存起來(lái),以保證下次利用同樣的參數(shù)來(lái)執(zhí)行該方法時(shí)可以直接從緩存中獲取結(jié)果,而不需要再次執(zhí)行該方法。
@CachePut 標(biāo)注的方法在執(zhí)行前不會(huì)去檢查緩存中是否存在之前執(zhí)行過(guò)的結(jié)果,而是每次都會(huì)執(zhí)行該方法,并將執(zhí)行結(jié)果以鍵值對(duì)的形式存入指定的緩存中。
@CacheEvict 用來(lái)標(biāo)注在需要清除緩存元素的方法或類上的。
當(dāng)然這些注解里面還有很多其他的屬性配置,配合 spring-el 表達(dá)式能做的事情還有很多,大概只有你想不到,沒(méi)有做不到。
在業(yè)務(wù)規(guī)則比較復(fù)雜的情況下,緩存 key 的設(shè)計(jì)相當(dāng)重要,設(shè)計(jì)出色可以使你的應(yīng)用飛起來(lái)。
整個(gè)集成工作就結(jié)束了,是不是很簡(jiǎn)單,上述算是 redis 的冰山一角,還有很多像 redis 路由/分布式/集群....,有機(jī)會(huì)實(shí)踐慢慢體會(huì)。
作者:Orson
出處:http://www.cnblogs.com/java-class/
如果,您認(rèn)為閱讀這篇博客讓您有些收獲,不妨點(diǎn)擊一下右下角的【推薦】
如果,您希望更容易地發(fā)現(xiàn)我的新博客,不妨點(diǎn)擊一下左下角的【關(guān)注我】
如果,您對(duì)我的博客內(nèi)容感興趣,請(qǐng)繼續(xù)關(guān)注我的后續(xù)博客,我是【Orson】
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段 聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
http://www.cnblogs.com/java-class/p/7112541.html