系统程序处理时,缓存作为DB的一道屏障,可以防止大量请求达到数据库,造成压力过大,还可以提高查询效率。
image.png
如何解决先删缓存,后更新库带来的脏数据问题和缓存更新失败问题? 1、对数据库和缓存操作做同步,性能有损失。使用分布式锁 2、 双删,A更新数据库,A删除缓存,A.sleep(1000),A删除缓存
更新失败使用MQ来实现重试,订阅数据库binlog日志或者使用框架的拦截器订阅写操作。
大概回顾一下Spring cache 的用法
属性 | 解释 |
---|---|
value | 缓存的名称 |
key | 缓存的key写法按照SpEL预发,默认使用方法名+参数组合 |
condition | 缓存的条件,SpEl表达式 |
属性 | 解释 |
---|---|
allEntries | 是否清空所有缓存,默认false |
beforeInvocation | true:方法执行前删除,默认false方法执行后删除 |
@Caching(put = {
@CachePut(value = "user", key = "#user.id"),
@CachePut(value = "user", key = "#user.name")
})
public User save(User user) {}
Spring默认是先写库,后写缓存,可以通过beforeInvocation指定。