博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis - 缓存穿透、缓存雪崩、缓存击穿、DB缓存一致性、缓存淘汰
阅读量:3781 次
发布时间:2019-05-22

本文共 1171 字,大约阅读时间需要 3 分钟。

目录


一、缓存穿透

概念 - 访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。

存在场景

  • 系统设计不合理,缓存数据更新不及时
  • 爬虫等恶意攻击

解决方案

  • 采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤
  • 若访问 key 在 DB 中不存在,在 Redis 中写入一个空值,设置一个较短的过期时间,避免长期占用内存。

二、缓存雪崩

概念

大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。

解决方案

  • 事前:使用主从复制+哨兵或者Redis集群。
  • 事中:本地缓存结合限流和降级。
  • 事后:开启持久化配置,实现快速缓存的快速恢复。 
  • 可以给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效。

三、缓存击穿

概念

热点 key 问题,一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。

解决方案

  • 在访问key之前,采用SETNX(set if not exists)来设置另一个短期 key 来锁住当前 key 的访问,访问结束再删除该短期key(互斥锁,同一时刻只允许一个线程去构建缓存,其他线程等待构建完毕后去缓存取)
  • 同一时刻只允许一个线程去构建缓存,其他线程等待构建完毕后去缓存取

四、数据库、缓存双写不一致

概念

当一个数据需要更新时,不可能做到同时更新数据库和缓存,那么此时读取数据的时候就一定会发生数据不一致问题,而数据不一致问题在金融交易领域的系统中是肯定不允许的。

解决方案

  • 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
  • 更新的时候,先更新数据库,然后再删除缓存。

五、缓存淘汰策略

概念

缓存 30G 的数据,但 Redis 本身只支持 10G,则使用缓存淘汰机制,保留最重要的 10个G 数据。

Redis 提供的淘汰策略

  • 查看 Redis 允许使用的最大内存,属性:server.maxmemory
  • 指定数据淘汰算法 :maxmemory-policy allkeys-lru
  • LRU和最小TTL算法的样本个数 :maxmemory-samples 5​​​​​​​
  • volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
  • allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集中任意选择数据淘汰
  • no-enviction:内存不足时添加数据会报错
  •  

转载地址:http://trlvn.baihongyu.com/

你可能感兴趣的文章
实验二 二维随机变量信息量的计算
查看>>
使用react脚手架创建react项目时发生错误
查看>>
关于setState是异步与同步的
查看>>
56. 合并区间---js解法
查看>>
5. 最长回文子串---js解法
查看>>
USACO 2007 Open Gold/acwing2240:餐饮 (拆点+最大流)‘三分图匹配’
查看>>
那些年你不知道的C++STL进制转换函数
查看>>
区间和并问题 思路加模板整理(校门外的树)
查看>>
C++中next_permutation函数的使用方法、原理及手动实现
查看>>
网络流常用小技巧之 拆点
查看>>
最大权闭合子图
查看>>
最小权点覆盖集 与 最大权独立集
查看>>
POJ 2125 Destroying The Graph && Acwing 2325. 有向图破坏(拆点+最小权点覆盖集)
查看>>
计算几何基础知识整理大全 代码模板与证明过程 (直线、向量、多边形、三维计算几何、凸包、半平面交、最小圆覆盖)
查看>>
计算几何之 判断两线段是否相交 代码模板与证明
查看>>
三维计算几何之三维凸包 增量法
查看>>
MySQL变量,存储过程,函数,流程控制详解(小白都能懂哦)
查看>>
9篇小白都能懂系列博客学完MySQL基础
查看>>
还在为Linux入门发愁?
查看>>
如何优雅而又不失内涵的在centos7下安装tree命令
查看>>