Spring方法级别缓存,使用redis存储缓存数据
Spring缓存
Spring方法级别缓存,使用redis存储缓存数据
介绍
1 2 3 4 5 6 7 8 9
| // 设置一个类中多个方法的cacheNames,优先级低于具体方法上的cacheNames @CacheConfig(cacheNames = "branch") // 缓存,key最好设置,防止重复;cacheManager在配置类中配置过期时间 @Cacheable(key = "'city_' + #city + '_' + #platform",cacheManager = "branchByCity") // 配置清除方法,allEntries=true,才会在调用时一定清除缓存数据,默认为false @CacheEvict(cacheManager = "branchByCity",value="branch", allEntries=true)
//每次都会执行方法,并将结果存入指定的缓存中 未测试 @CachePut("users")
|
实例
缓存配置
过期时间,结合redis配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| @EnableCaching @Configuration public class CacheConfig {
@Bean("branchByCity") @Primary public CacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager("branch"); cacheManager.setCaffeine(Caffeine.newBuilder() .initialCapacity(10000) .expireAfterWrite(120, TimeUnit.SECONDS) // .weakKeys() .recordStats()); return cacheManager; }
@Bean("branchExclusively") public CacheManager cacheExclusivelyManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager("branchExclusivelys"); cacheManager.setCaffeine(Caffeine.newBuilder() .initialCapacity(10000) .expireAfterWrite(120, TimeUnit.SECONDS) // .weakKeys() .recordStats()); return cacheManager; }
/** * 使用redis作缓存 * @param factory * @return */ @Bean(value = "pointMallManager",autowireCandidate=false) public CacheManager pointMallCacheManager(RedisConnectionFactory factory) { //初始化一个RedisCacheWriter RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(factory); //设置CacheManager的值序列化方式为json序列化 RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer(); RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(jsonSerializer); //设置默认超过期时间是600秒,不缓存null值 RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair).entryTtl(Duration.ofSeconds(600)).disableCachingNullValues(); RedisCacheManager redisCacheManager = new RedisCacheManager(redisCacheWriter, defaultCacheConfig); /* CaffeineCacheManager cacheManager = new CaffeineCacheManager("pointMall", "allSpecRemark"); cacheManager.setCaffeine(Caffeine.newBuilder() .initialCapacity(500) .expireAfterWrite(10, TimeUnit.MINUTES) // .weakKeys() .recordStats());*/
return redisCacheManager; }
}
|
controller使用
AppBranchClient接口单独抽离出供其他服务依赖,这是AppBranchClient的实现AppBranchRemote
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @Slf4j @RestController @CacheConfig(cacheNames = "branch") public class AppBranchRemote implements AppBranchClient { @Autowired private IBranchService branchService;
@Cacheable(key = "'findBranchExclusivelyById_' + #id",cacheManager = "branchExclusively",cacheNames = "branchExclusivelys") @Override public Result<BranchExclusivelyGoodsDto> findBranchExclusivelyById(Long id) { BranchExclusivelyGoodsDto branchGoodsExclusivelyDto =null; try{ branchGoodsExclusivelyDto = branchService.findBranchExclusivelyById(id); }catch (IllegalArgumentException e){ return Result.error(e.getMessage()); } return Result.success(branchGoodsExclusivelyDto); } }
|
清除缓存方法
接口
1 2 3 4 5
| public interface BranchCatchService { void clearBranchCatch();
void clearBranchExclusivelyCatch(); }
|
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @CacheConfig(cacheNames = "branch") @Service @Slf4j public class BranchCatchServiceImpl implements BranchCatchService {
@CacheEvict(cacheManager = "branchByCity",value="branch", allEntries=true) @Override public void clearBranchCatch(){ log.info("清理门店缓存branchByCity"); }
@CacheEvict(cacheNames = "branchExclusivelys", cacheManager = "branchExclusively",value="branchExclusivelys", allEntries=true) @Override public void clearBranchExclusivelyCatch(){ log.info("清理门店专供branchExclusively"); } }
|