这里讨论本地缓存、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天级别;
当然,也要考虑数据的更新频率的问题