Spring 極速集成註解 redis 實踐

Redis 作爲基於內存的 Key-Value 數據庫,用來作緩存服務器性價比至關高。php

官方推出的面向 Java 的 Client Jedis,提供了不少接口和方法,可讓 Java 操做使用 Redis。java

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

本文重點描述集成過程,能讓你迅速的經過 spring-data-redis 將 redis 集成到 spring 項目中,畢竟你們都忙的。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 相關類 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 統一的調度和管理者,有興趣能夠反編譯源碼看看。bash

繼承自 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, 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 生成的規則。

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

 

 

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

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

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

整個集成工做就結束了,是否是很簡單,上述算是 redis 的冰山一角,還有不少像 redis 路由/分佈式/集羣….,有機會實踐慢慢體會。
這裏推薦一下個人JAVA架構學習交流羣:614478470 點擊加入,想要學習Java高架構、分佈式架構、高可擴展、高性能、高併發、性能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分佈式項目實戰學習架構師視頻都有整理,送給每一位JAVA小夥伴,有想學習JAVA架構的,或是轉行,還有工做中想提高本身能力的,正在學習的小夥伴歡迎加入學習。

相關文章
相關標籤/搜索