Contents

数据库-redis-小林coding-缓存篇

本系列笔记为作者在跟随小林coding学习的时候做的笔记。感谢小林大大。

缓存雪崩、击穿、穿透

缓存雪崩

本质:大量请求来到数据库

原因:大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机

https://cdn.xiaolincoding.com//mysql/other/717343a0da7a1b05edab1d1cdf8f28e5.png

解决方法:

大量缓存数据在同一时间过期(失效)

  • 均匀设置过期时间,给过期时间添加随机数
  • 如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存

Redis 故障宕机

  • 服务熔断或请求限流机制
  • 构建 Redis 缓存高可靠集群

缓存击穿

本质:大量单一热点数据请求直达数据库

原因:缓存中的某个热点数据过期了

https://cdn.xiaolincoding.com//mysql/other/acb5f4e7ef24a524a53c39eb016f63d4-20230309232840753.png

解决办法

  • 互斥锁方案
  • 热点数据不设置过期时间

缓存穿透

本质:大量非法请求直达数据库

原因:业务误操作或黑客恶意攻击

https://cdn.xiaolincoding.com//mysql/other/b7031182f770a7a5b3c82eaf749f53b0-20230309232834574.png

解决办法

  • 非法请求的限制
  • 缓存空值或者默认值
  • 使用bloom过滤器快速判断数据是否存在

总结

https://cdn.xiaolincoding.com//mysql/other/061e2c04e0ebca3425dd75dd035b6b7b.png

数据库和缓存如何保证一致性

所有的问题都是并发导致的,先修改数据库还是先修改缓存,当两个修改请求来时第一个请求先修改了数据库(缓存),第二个请求修改完数据库和缓存,最后第一个请求修改缓存(数据库)就会出现不一致现象。

如果我们的业务对缓存命中率有很高的要求,我们可以采用「更新数据库 + 更新缓存」的方案,因为更新缓存并不会出现缓存未命中的情况

如果对命中率要求不高的话,使用的是更新数据库再删除缓存,go-zero是这样的

 |