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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 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月前
|
存储 缓存 监控
缓存击穿、缓存穿透、缓存雪崩 3大问题,如何彻底解决?
【10月更文挑战第8天】在分布式系统中,缓存的使用极大地提高了系统的性能和响应速度。然而,缓存击穿、缓存穿透和缓存雪崩是三个常见的缓存相关问题,它们可能导致系统性能下降,甚至引发系统崩溃。本文将深入探讨这三个问题的成因、影响以及彻底的解决方案。
80 1
|
2月前
|
缓存 NoSQL 关系型数据库
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
本文深入探讨了Redis缓存的相关知识,包括缓存的概念、使用场景、可能出现的问题(缓存预热、缓存穿透、缓存雪崩、缓存击穿)及其解决方案。
186 0
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
|
4月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
|
6月前
|
缓存 NoSQL Java
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
113 0
|
2月前
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
55 2
|
3月前
|
存储 缓存 NoSQL
解决Redis缓存击穿问题的技术方法
解决Redis缓存击穿问题的技术方法
74 2
|
7月前
|
缓存 监控 NoSQL
redis 缓存穿透 击穿 雪崩 的原因及解决方法
redis 缓存穿透 击穿 雪崩 的原因及解决方法
|
4月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
这篇文章介绍了如何在SpringBoot项目中整合Redis,并探讨了缓存穿透、缓存雪崩和缓存击穿的问题以及解决方法。文章还提供了解决缓存击穿问题的加锁示例代码,包括存在问题和问题解决后的版本,并指出了本地锁在分布式情况下的局限性,引出了分布式锁的概念。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
|
3月前
|
缓存 NoSQL 前端开发
16)缓存雪崩、缓存击穿、缓存穿透
16)缓存雪崩、缓存击穿、缓存穿透
38 0
|
4月前
|
缓存 数据库
缓存穿透和击穿
【8月更文挑战第16天】
45 0
缓存穿透和击穿
下一篇
无影云桌面