javascript
Spring 极速集成注解 Redis 实践
Redis 做為基于內存的 Key-Value 數據庫,用來做緩存服務器性價比相當高。
官方推出的面向 Java 的 Client Jedis,提供了很多接口和方法,可以讓 Java 操作使用 Redis。
Spring 團隊對 Jedis 進行了封裝,獨立為 spring-data-redis 項目,配合 spring 特性并集成 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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/contexthttp://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 提供。
如果你熟悉 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 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;}@Beanpublic KeyGenerator keyGenerator() {return new KeyGenerator() {@Overridepublic 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. 在你喜歡的地方進行注解緩存
緩存一般使用在服務層,在你想緩存的方法上面添加相應的注解即可,下面三個緩存的注解你得掌握。
-
@Cacheable spring 會在其被調用后將返回值緩存起來,以保證下次利用同樣的參數來執行該方法時可以直接從緩存中獲取結果,而不需要再次執行該方法。
-
@CachePut 標注的方法在執行前不會去檢查緩存中是否存在之前執行過的結果,而是每次都會執行該方法,并將執行結果以鍵值對的形式存入指定的緩存中。
-
@CacheEvict 用來標注在需要清除緩存元素的方法或類上的。
當然這些注解里面還有很多其他的屬性配置,配合 spring-el 表達式能做的事情還有很多,大概只有你想不到,沒有做不到。
在業務規則比較復雜的情況下,緩存 key 的設計相當重要,設計出色可以使你的應用飛起來。
整個集成工作就結束了,是不是很簡單,上述算是 redis 的冰山一角,還有很多像 redis 路由/分布式/集群….,有機會實踐慢慢體會。
總結
以上是生活随笔為你收集整理的Spring 极速集成注解 Redis 实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如果把线程当作一个人来对待,所有问题都瞬
- 下一篇: 面试问:Kafka 为什么速度那么快?