大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述分布式技术带你分析认识缓存穿透/雪崩/击穿相关的知识,希望能为你提供帮助。
使用场景加速请求响应缓存更新策略
- LRU(Least Recently Used),根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高,则延迟其淘汰时间” - LRU缓存更新
- LFU(Least Frequently Used)根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”- LFU缓存更新
- FIFO ,根据"
先进先出"
思想来更新缓存数据
- 超时剔除 - expire
- 主动更新 - 开发控制生命周期
- 扩展:缓存污染 - 缓存污染降低了缓存的使用率,把不常用的数据读取到缓存,同时会把常用的数据移出缓存,这样会直接降低系统的数据命中率
- 主动更新 - 开发控制生命周期
文章图片
解决方法
分布式队列及分布式锁缓存空对象:如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),仍然把这个空结果进行缓存,但它的过期时间会很短,不超过5分钟。通过这个直接设置的默认值存放到缓存,这样第二次到缓存中获取就有值了,而不会继续访问数据库。当修改或者新增改key的数据信息的时候,需要删除或者更新null缓存值**
存在的问题:
- 需要更多的键,所以通常设置较短过期时间
- 缓存层和存储层数据" 短期" 不一致
文章图片
借用图:高可用架构
布隆过滤器:对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力。例如Redis可以使用bitMap来实现布隆过滤器。
文章图片
借用图:高可用架构
缓存击穿问题 【单个热点key失效时,高并发查询数据库】
解决方法
使用分布式锁使用本地缓存(双级缓存)热点不过期**到期前的续命缓存雪崩问题场景【多个key同时失效,高并发查询数据库】
解决方案
- 对不用的数据使用随机动态分布的失效时间
- 使用集群化分摊部署我们key
- 使用二级缓存
- 使用分布式锁
- 【分布式技术带你分析认识缓存穿透/雪崩/击穿】数据预热:可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
- 依赖隔离组件为后端限流并降级 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
推荐阅读
- 分布式ID生成服务,推荐大家搞一个太香了
- 如果云是水滴,Kubernetes就是水滴管理平台
- 如何选择最佳的Node.js框架(Express.js,Koa.js或Sails.js)
- 如何在Node.js中递归读取目录
- 如何轻松在Node.js中将事件发射器与ES5和ES6结合使用
- 如何使用Node.js中的文件系统(fs)模块创建文件
- 如何在Node.js中将文本转换(合成)为语音
- CRM如何提高IT公司的利率
- 如何在Node.js中使用nodemailer发送电子邮件(gmail,Outlook和Zoho)