Spring下配置Redis
1. redis是一種支援Key-Value等多種資料結構的儲存系統。可用於快取、事件釋出或訂閱、高速佇列等場景。該資料庫使用ANSI C語言編寫,支援網路,提供字串、雜湊、列表、佇列、集合結構直接存取,基於記憶體,可持久化。
2. Redis一共支援五種資料類:string(字串)、hash(雜湊)、list(列表)、set(集合)和zset(sorted set 有序集合)。
1】 新建redis.properties,裡面包含redis連線需要的配置資訊。(cloud的配置)
# Redis配置 # Redis資料庫索引(預設為0) spring.redis.database=0 # Redis伺服器地址 spring.redis.host=localhost # Redis伺服器連線埠 spring.redis.port=6379 # Redis伺服器連線密碼(預設為空) spring.redis.password=redis # 連線池最大連線數(使用負值表示沒有限制) spring.redis.pool.max-active=8 # 連線池最大阻塞等待時間(使用負值表示沒有限制) spring.redis.pool.max-wait=-1 # 連線池中的最大空閒連線 spring.redis.pool.max-idle=8 # 連線池中的最小空閒連線 spring.redis.pool.min-idle=0 # 連線超時時間(毫秒) spring.redis.timeout=10000
2】 maven的pom.xml檔案匯入架包。
高版本可能會引起版本的衝突,所以我採用的為1.7.2的版本,具體的看具體情況而定。
<!-- redis架包 --> <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.2.RELEASE</version> </dependency>
3】spring管理bean的生成,xml檔案配置。
<!-- 配置 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.sxd.util.RedisCacheConfig"> <constructor-arg ref="jedisConnectionFactory"/> <constructor-arg ref="redisTemplate"/> <constructor-arg ref="redisCacheManager"/> </bean>
JedisPoolConfig | jedis連線池配置物件 |
JedisConnectionFactory | jedis連線工廠,生成連線物件 |
RedisTemplate | RedisTemplate 對 RedisConnection 進行了封裝。提供連線管理,序列化等功能,它對 Redis 的互動進行了更高層次的抽象,極大的方便和簡化了 Redis 的操作 |
RedisCacheManager | 做為 redis 統一的排程和管理者 |
RedisCacheConfig |
RedisCacheConfig extends org.springframework.cache.annotation.CachingConfigurerSupport,自定義redis的key生成規則,如果不在註解引數中註明key=“”的話,就採用這個類中的key生成規則生成key。 |
4】 RedisCacheConfig redis自定義的工具類,自定義redis的key生成規則。
package com.sxd.util;
import java.lang.reflect.Method;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
@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 target, Method method,
Object... params) {
//規定 本類名+方法名+引數名 為key
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName()+"_");
sb.append(method.getName()+"_");
for (Object obj : params) {
sb.append(obj.toString()+",");
}
return sb.toString();
}
};
}
}
5】在想要做快取的地方,使用註解進行快取:
1)@CacheConfig 配置在類上,cacheNames即定義了本類中所有用到快取的地方,都去找這個庫。只要使用了這個註解,在方法上@Cacheable @CachePut @CacheEvict就可以不用寫value去找具體庫名了。【一般不怎麼用】
2)@Cacheable 配置在方法或類上,作用:本方法執行後,先去快取看有沒有資料,如果沒有,從資料庫中查找出來,給快取中存一份,返回結果,下次本方法執行,在快取未過期情況下,先在快取中查詢,有的話直接返回,沒有的話從資料庫查詢
3)@CachePut 類似於更新操作,即每次不管快取中有沒有結果,都從資料庫查詢結果,並將結果更新到快取,並返回結果
4)@CacheEvict 用來清除用在本方法或者類上的快取資料(用在哪裡清除哪裡)。
說明:
①使用了@Cacheable(value="myUser"),即表示快取中有,直接從快取取出,沒有的話先從資料庫中查出,然後再插入;
②如果未在類上使用@CacheConfig註解規定資料要快取到哪個庫中,就必須給value一個值,規定資料最後快取到哪個redis庫中
③因為redis快取資料實際就是鍵值對的形式儲存,因此必須給定key-value的key,這裡沒有給key引數賦值,所以key的生成規則按照上面工具類中規定的key生成的;
④key-value的value就是本方法的返回值,如果要快取登入使用者資訊,本方法需要進行修改,返回user物件就可以快取到key-value的value中。