三级缓存(缓存穿透、缓存击穿)

198 阅读2分钟

这里讨论本地缓存、redis、mysql的三级缓存

这里讨论管理域写&读配置,运行域读配置的情形

实现方式

两种实现方式,读都是读本地缓存,第一种更适合qps大的情况

1. 查本地缓存,脚本刷缓存;

mysql往redis定时脚本轮询,加分布式锁,写redis,更新redis的过期时间, redis写本地缓存

2. 查本地缓存,懒加载;

查不到再去查redis,redis写本地缓存,

redis查不到的话再按某id,如数据库主键key加分布式锁,查mysql,

避免缓存击穿(大量qps同时不命中缓存,打向mysql)

如何避免缓存穿透?

缓存穿透指用不存在的数据去请求服务,

这样如果按照原来的方式,每次都命不中本地缓存、redis,

次次都查库了,给mysql带来很大压力

所以,对于不存在的数据,查了mysql之后,

也要向redis内为这个key写空值,给本地缓存写空值

但这个redis key的过期时间,一般比redis内真实存在的key的过期时间短很多,用于处理后续可能存在了的情形

更新时如何处理?

mysql发生值变更的时候,有两种途径:

1. 写mysql时,双写redis

2. 把redis的key删除,下次查询的时候再懒加载

推荐后者,可以将写redis的操作收敛到一个服务

其他要考虑的问题

1. 大量qps打向db的时候,可以尝试调短db的超时时间,避免一个慢sql卡住之后,mysql积压, 这个也与mysql的配置&性能有关

2. 小qps可以考虑过期时间本地缓存秒级别,redis分钟级别;

大qps可以考虑过期时间本地缓存分钟级别,redis天级别;

当然,也要考虑数据的更新频率的问题