1. 新增專案依賴
2. 新增spring-redis-context 設定
3. 新增redis.properties
4. 寫自訂redis 設定類別
#5. 在你喜歡的地方進行註解快取
Redis 做為基於記憶體的Key-Value 資料庫,用來做快取伺服器性價比相當高。
官方推出的針對 Java 的 Client Jedis,提供了許多介面和方法,可以讓 Java 操作使用 Redis。
Spring 團隊對 Jedis 進行了封裝,獨立為 spring-data-redis 項目,配合 spring 特性並整合 Jedis 的一些指令和方法。
本文著重在整合過程,能讓你迅速的透過 spring-data-redis 將 redis 整合到 spring 專案中,畢竟大家都忙的。
本文重點描述整合過程,能讓你迅速的透過 spring-data-redis 將 redis 整合到 spring 專案中,畢竟大家都忙的。
<!--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>
<?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 "><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。
#============================# #==== 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 遇到問題故障時,要理解這裡的選項是個不錯的選擇,更多配置項目詳解。
@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; } @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 產生的規則。
緩存一般使用在服務層,在你想快取的方法上面添加對應的註解即可,下面三個快取的註解你得掌握。
@Cacheable spring 會在其被呼叫後將回傳值快取起來,以確保下次利用相同的參數來執行該方法時可以直接從快取中取得結果,而不需要再次執行該方法。
@CachePut 標註的方法在執行前不會去檢查快取中是否存在先前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的快取中。
@CacheEvict 用來標示在需要清除快取元素的方法或類別上的。
當然這些註解裡面還有很多其他的屬性配置,配合 spring-el 表達式能做的事情還有很多,大概只有你想不到,沒有做不到。
在業務規則比較複雜的情況下,快取 key 的設計相當重要,設計出色可以讓你的應用程式飛起來。
以上是Spring基於註解整合Redis的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!