Gitlib Gitlib
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)

Ravior

以梦为马,莫负韶华
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)
  • 操作系统

  • 计算机网络

  • 数据结构和算法

  • MySQL

  • Redis

    • Redis持久化和数据数据恢复
    • Redis发布订阅
    • Redis管道技术
    • Redis事务机制
    • Redis数据过期和淘汰策略
    • Redis中BitMap使用
    • Redis中lua脚本使用
    • Redis通信协议(RESP)入门
    • Redis性能测试Redis-benchmark
    • Redis主从模式搭建及应用
    • Redis集群及高可用实现
    • Redis和Memcache对比
    • Redis缓存穿透、缓存击穿、缓存雪崩
      • 缓存穿透
        • 解决方案
      • 缓存雪崩
        • 解决方案
      • 缓存击穿
        • 解决方案
    • Redis万字总结
    • 如此简单:Redis安装
    • Memcached安装部署
  • Nginx

  • MongoDB

  • 其他

  • 计算机基础
  • Redis
Ravior
2016-07-12
目录

Redis缓存穿透、缓存击穿、缓存雪崩

正常的一个缓存处理流程都会这样设计:请求数据 ,后段先从缓存中get数据,get到直接返回结果,get不到时从DB中取,DB取到更新缓存,并返回结果,DB也没取到,那直接返回空结果,流程见下图:

# 缓存穿透

缓存穿透是指查询一个一定不存在的数据,如果规则是从数据库中查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中查询,失去了缓存的意义,这也是经常提的缓存命中率问题。在流量大时,可能数据库就挂掉了,也可以利用不存在的key频繁攻击应用。

# 解决方案

  • 如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,同时设置缓存时间;
  • 在数据处理层,进行数据校验,判断数据类型和数据范围;
  • 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力;

# 缓存雪崩

缓存雪崩是指由于大量原有缓存同时过期(或者数据未加载到缓存中),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机,造成系统的崩溃。

# 解决方案

  • 缓存过期时间差异化,避免同一时间过期;

# 缓存击穿

缓存击穿是指某个设置了过期时间的热门key,在某个高并发访问的时间点过期,将会有多个数据查询请求同时发到数据库,对数据库CPU和内存造成冲击,严重的会造成数据库宕机,造成系统的崩溃。

缓存击穿和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。

# 解决方案

  • 热门key设置为永不过期,后台进行动态更新;
  • 设置互斥锁:
#Redis
上次更新: 2022/12/01, 11:09:34
Redis和Memcache对比
Redis万字总结

← Redis和Memcache对比 Redis万字总结→

最近更新
01
常用游戏反外挂技术总结
11-27
02
Golang开发实践万字总结
11-11
03
Redis万字总结
10-30
更多文章>
Theme by Vdoing | Copyright © 2011-2022 Ravior | 粤ICP备17060229号-3 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式