数据库-redis-小林coding-缓存篇
Contents
本系列笔记为作者在跟随小林coding学习的时候做的笔记。感谢小林大大。
缓存雪崩、击穿、穿透
缓存雪崩
本质:大量请求来到数据库
原因:大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机
解决方法:
大量缓存数据在同一时间过期(失效)
- 均匀设置过期时间,给过期时间添加随机数
- 如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存
Redis 故障宕机
- 服务熔断或请求限流机制
- 构建 Redis 缓存高可靠集群
缓存击穿
本质:大量单一热点数据请求直达数据库
原因:缓存中的某个热点数据过期了
解决办法
- 互斥锁方案
- 热点数据不设置过期时间
缓存穿透
本质:大量非法请求直达数据库
原因:业务误操作或黑客恶意攻击
解决办法
- 非法请求的限制
- 缓存空值或者默认值
- 使用bloom过滤器快速判断数据是否存在
总结
数据库和缓存如何保证一致性
所有的问题都是并发导致的,先修改数据库还是先修改缓存,当两个修改请求来时第一个请求先修改了数据库(缓存),第二个请求修改完数据库和缓存,最后第一个请求修改缓存(数据库)就会出现不一致现象。
如果我们的业务对缓存命中率有很高的要求,我们可以采用「更新数据库 + 更新缓存」的方案,因为更新缓存并不会出现缓存未命中的情况
如果对命中率要求不高的话,使用的是更新数据库再删除缓存,go-zero是这样的