应对危机如何处理缓存击穿风险

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生内存数据库 Tair,内存型 2GB
简介: 【6月更文挑战第9天】本文介绍如何应对缓存穿透,这可以通过限制IP访问次数、预热缓存、设置空值以及使用布隆过滤器来过滤非法请求。布隆过滤器占用空间小,有误判率但速度快,适用于广告投放、内容推荐和数据库查询等场景。其优点包括低时间复杂度、并行运算和节省空间,但存在误判、无法存储元素及删除操作的局限性。

简介:

本文探讨了缓存击穿问题及其解决方案,特别是使用布隆过滤器的方法。布隆过滤器是一种概率数据结构,用于高效验证元素是否可能存在于集合中,减少对昂贵资源的查询。

如何应对缓存击穿的场景,比如:

    黑客攻击,用户错误的服务?
    服务启动了,但是缓存没有数据? 

mandala曼德罗符号.png

1 使用bloom fliter的场景

Bloom 过滤器是由 Burton Howard 于 1970 年构思的一种概率数据结构,它提供了一种有效的方法来验证条目肯定不在集合中。

这使得它在尝试在访问成本高昂的资源(例如通过网络或磁盘)上搜索项目时特别理想:

如果我有一个大型磁盘数据库,并且我想知道其中是否存在密钥user,

我们可以先查询Bloom过滤器,这将确定地告诉我它是否存在(然后磁盘查找可以继续)或不存在存在,在这种情况下,我可以放弃昂贵的磁盘查找,只需向堆栈发送否定回复。

2 应对缓存穿透

  • 原因和现象

    面对现代互联网中大量的恶意攻击,造成大量访问不存在的key。
    例如登陆时使用无效的用户名,在网站查询成绩输入没有的账号,准考证等。

或者大量请求访问数据库中有但是redis中没有的key,例如新业务刚刚上线,此时的redis为空。
如此应用程序可能跳过缓存直接访问数据库去查询,导致数据库连接过多,消耗系统资源。

  • 解决办法

针对比较少请求的ip地址,主动限制其访问次数,或者拉黑该ip,使用应用程序检查key的合法性,提前拒绝不合法的请求,比如使用bloom过滤器。

预热redis,运行一个批处理程序,将可能会大量访问的数据预先加载到redis,业务再进行服务,在最前端进行流量控制,逐步释放进来请求。

给出一段时间,让redis逐步加载热数据。如果数据库也没有key,redis就设置key值为null或空。

3 使用的例子

虽然可以使用其他数据结构(例如哈希表)来执行此操作,但布隆过滤器也特别有用,因为它们每个元素占用的空间非常小,通常以位数(而不是字节数!将存在一定比例的误报(这是可控的),但对于集合中是否存在密钥的初始测试,它们提供了出色的速度,最重要的是出色的空间效率。

布隆过滤器用于各种应用,例如广告投放——确保用户不会太频繁地看到广告;同样,在内容推荐系统中 - 确保推荐不会太频繁地出现,在数据库中 - 在磁盘上访问条目之前快速检查表中是否存在该条目,等等。

    # python3
import redis

import redisbloomfilter

name = "bloomfilter"
number_of_insertion=10000000
error_rate = 0.00001
redis_client = redis.StrictRedis()

bloom_filter = redisbloomfilter.RedisBloomFilter(name, number_of_insertion, error_rate, redis_client)
try:
    bloom_filter.initialize()
except redis.RedisError:
    print('occurs redis error')
    raise
except redisbloomfilter.BloomFilterException:
    print('bloom filter exception')
    raise 
bloom_filter.put("abc")
bloom_filter.contains("abc")

4 小结:

布隆过滤器的原理是当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数数组的K个点。

把它们置为1.检索时,这些点是不是都是1就大概知道集合中有没有目标值。

如果这些点有任何一个为0,则被检元素一定不在,如果都是1,则被检锁元素可能存在。

  • 优点:

          1 增加和查询元素的时间复杂度为:O(K), K 为哈希函数的个数,一般较小,与数据量大小无关
    
          2 哈希函数相互之间没有关系,方便硬件并行运算
    
          3 布隆过滤器不需要存储元素本身,在某些对保密要求严格的场合有很大优势
    
          4 在能够承受一定的误判时,布隆过滤器比其他数据结构有很大空间优势
    
          5 数据量大时,布隆过滤器可以表示全集,其他数据结构不能
    
          6 使用同一组散列函数的布隆过滤器可以进行交,并,差运算
    
  • 缺点:

          1 有误判率
    
          2 不能获取元素本身
    
          3 一般情况下不能从布隆过滤器删除元素
    

    4 如果采用计数方式删除,可能存在计数回绕问题

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
缓存 数据库
15- 什么是缓存击穿 ? 怎么解决 ?
`# 缓存击穿简介及解决方案` 缓存击穿是指大量请求同时命中已过期的缓存,导致数据库压力骤增。解决方法包括:1) 预热热点数据;2) 设置热点数据永不过期;3) 使用加锁或限流策略。
68 4
|
2月前
|
存储 缓存 NoSQL
redis缓存雪崩、穿透、击穿
redis缓存雪崩、穿透、击穿
|
20天前
|
缓存 NoSQL Java
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
26 0
|
2月前
|
缓存 监控 NoSQL
redis 缓存穿透 击穿 雪崩 的原因及解决方法
redis 缓存穿透 击穿 雪崩 的原因及解决方法
|
1天前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
22天前
|
存储 缓存 监控
详解缓存雪崩、缓存击穿、缓存穿透问题,一文掌握,干货不断
详解缓存雪崩、缓存击穿、缓存穿透问题,一文掌握,干货不断
|
2月前
|
缓存 数据库 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?--主从切换方案
【5月更文挑战第16天】该方案提出了解决Redis缓存穿透、击穿和雪崩问题的策略。通过使用两个或多个互为备份的Redis集群,确保在单个集群故障时,另一个可以接管。在故障发生时,业务会与备用集群保持心跳检测,并根据业务重要性分批转移流量,逐步增加对备用集群的依赖,同时监控系统稳定性。对于成本敏感的小型公司,可以采用低成本的单机或小规模自建Redis备份。此方案强调渐进式流量转移,以保护系统免受突然压力冲击。
31 1
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?--主从切换方案
|
20天前
|
缓存 NoSQL Java
Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
26 0
|
2月前
|
缓存 NoSQL 中间件
中间件缓存击穿和缓存雪崩
【5月更文挑战第5天】中间件缓存击穿和缓存雪崩
32 3
中间件缓存击穿和缓存雪崩
|
2月前
|
存储 缓存 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存穿透
【5月更文挑战第14天】解决缓存穿透问题有两种策略。一是回写特殊值,当数据不存在时,在缓存中存储特殊值以标记,避免下次重复查询数据库。但此方法可能被恶意请求利用,浪费内存。二是使用布隆过滤器,预先判断数据是否存在,减少无效数据库查询。布隆过滤器虽有假阳性可能,但概率低,可接受。此外,可先查缓存再查布隆过滤器,优化正常请求的效率。两种方式各有优劣,实际应用需根据场景选择。
33 3