ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis5️⃣缓存异常:穿透、击穿、雪崩

2022-04-18 21:34:09  阅读:197  来源: 互联网

标签:缓存 Redis5 Redis bitmaps 访问 雪崩 Key 过期


1、缓存穿透

缓存穿透访问的 Key 不存在

  • 查询缓存(Redis)时无法找到指定 Key,因此会请求查询数据库
  • 利用一个不存在的 Key 值进行攻击,会穿透数据库。

解决方案

  1. 对空值缓存:若查询返回的数据为 null,将结果 null 进行缓存并设置较短的过期时间(通常不超过 5min)
  2. 设置白名单:使用 bitmaps 定义一个可访问名单。
    • 名单 ID 作为 bitmaps 的偏移量。
    • 每次访问数据时,将访问者 ID 与 bitmaps 中的 ID 进行比较。
    • 若访问者 ID 不在 bitmaps 中则进行拦截。
  3. 布隆过滤器:哈希函数 + 位图
    • 作用:检索一个元素是否在一个集合中。
    • 特点:空间效率和查询效率快,但有一定的误识别率和删除困难。
    • 做法:将所有可能存在的数据哈希到一个足够大的 bitmaps 中,请求访问不存在的数据时会被 bitmaps 拦截。
  4. 实时监控:当 Redis 的命中率骤低,需排查访问对象和访问数据,可设置黑名单限制服务。

2、缓存击穿

缓存击穿访问的某个 Key 缓存过期,且有大量并发请求

  • Key 对应的数据存在,但在 Redis 中缓存过期。
  • 此时有大量并发请求数据库访问压力瞬间增大。,则 Redis 会从数据库加载大量数据并缓存。
  • 数据库的访问压力瞬间增大。

解决

  1. 预先设置热门数据:在 Redis 高峰访问前,将热门数据提前存入 Redis 中,增加热门数据 Key 的时长。

  2. 实时调整:实时监控热门的数据,调整对应 key 的过期时间。

3、缓存雪崩

缓存雪崩访问的多个 Key 缓存过期,且有大量并发请求

  • 击穿:一个 Key
  • 雪崩:多个 Key

解决

  • 构建多级缓存架构:nginx 缓存 + redis 缓存 + 其他缓存(ehcache等)
  • 使用锁或队列:不适合高并发情况(影响效率)
    • 使用锁或者队列,避免大量线程同时请求访问数据。
    • 从而避免缓存失效时,大量并发请求访问数据库。
  • 设置过期标志,更新缓存:设置缓存数据过期的提前量,达到后会通知另外的线程在后台更新缓存。
  • 将缓存失效时间错开
    • 在原有失效时间的基础上增加一个随机值。
    • 降低每个 Key 的缓存到期时间的重复率。

标签:缓存,Redis5,Redis,bitmaps,访问,雪崩,Key,过期
来源: https://www.cnblogs.com/secretmrj/p/16162873.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有