0%

Spring缓存

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");
}
}