Spring Boot整合redis做資料快取
阿新 • • 發佈:2019-02-03
package com.fcc.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; 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.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import java.lang.reflect.Method; /** * @Author:FeiCongcong * @Date:2017/7/3 0003 14:48 */ @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { /*定義快取資料 key 生成策略的bean 包名+類名+方法名+所有引數 */ @Bean public KeyGenerator wiselyKeyGenerator(){ return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } /*要啟用spring快取支援,需建立一個 CacheManager的 bean,CacheManager 介面有很多實現,這裡Redis 的整合,用 RedisCacheManager這個實現類 Redis 不是應用的共享記憶體,它只是一個記憶體伺服器,就像 MySql 似的, 我們需要將應用連線到它並使用某種“語言”進行互動,因此我們還需要一個連線工廠以及一個 Spring 和 Redis 對話要用的 RedisTemplate, 這些都是 Redis 快取所必需的配置,把它們都放在自定義的 CachingConfigurerSupport 中 */ @Bean public CacheManager cacheManager( @SuppressWarnings("rawtypes") RedisTemplate redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); // cacheManager.setDefaultExpiration(60);//設定快取保留時間(seconds) return cacheManager; } //1.專案啟動時此方法先被註冊成bean被spring管理 @Bean public RedisTemplate<String, String> redisTemplate( RedisConnectionFactory factory) {StringRedisTemplate template = new StringRedisTemplate(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }
Service層用法:
@Cacheable(value = "role",keyGenerator="wiselyKeyGenerator")
public RolePojo getRoleByStrs(String str,String str1,String str2){
return roleDao.getRoleByStr(str);
}