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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 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 如果采用计数方式删除,可能存在计数回绕问题

目录
相关文章
|
3月前
|
缓存 数据库连接 数据库
缓存三剑客(穿透、击穿、雪崩)
缓存穿透指查询数据库和缓存中都不存在的数据,导致请求直接冲击数据库。解决方案包括缓存空对象和布隆过滤器。缓存击穿是大量请求访问同一个失效的热点数据,使数据库瞬间压力剧增,解决方法有提前预热、设置永不过期、加锁限流等。缓存雪崩是大量key同时失效,导致所有请求直达数据库,可通过引入随机过期时间缓解。三者分别对应单点爆破、全面崩塌等问题,需根据场景选择合适策略优化系统性能与稳定性。
218 0
|
3月前
|
存储 缓存 NoSQL
如何解决缓存击穿?
缓存击穿是指热点数据失效时大量请求直接冲击数据库,可能导致系统崩溃。解决方案包括:永不过期策略避免缓存失效瞬间的穿透;互斥锁控制并发访问;热点预热提前刷新缓存;熔断降级在数据库压力大时返回默认值;二级缓存降低Redis压力。实际中常组合使用多种方案,如热点预热+互斥锁+熔断降级,以提升系统稳定性与性能。
318 0
|
2月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
201 0
|
3月前
|
缓存 NoSQL 数据库
什么是缓存击穿
缓存击穿是指热点缓存key突然失效,导致大量并发请求直接冲击数据库,造成巨大压力。常见于高并发场景,如热门商品信息失效时。解决方法包括设置热点key永不过期、使用分布式锁、预热数据、熔断降级等,以保障系统稳定性。
475 0
|
7月前
|
缓存 监控 NoSQL
Redis--缓存击穿、缓存穿透、缓存雪崩
缓存击穿、缓存穿透和缓存雪崩是Redis使用过程中可能遇到的常见问题。理解这些问题的成因并采取相应的解决措施,可以有效提升系统的稳定性和性能。在实际应用中,应根据具体场景,选择合适的解决方案,并持续监控和优化缓存策略,以应对不断变化的业务需求。
1298 29
|
12月前
|
存储 缓存 监控
缓存击穿、缓存穿透、缓存雪崩 3大问题,如何彻底解决?
【10月更文挑战第8天】在分布式系统中,缓存的使用极大地提高了系统的性能和响应速度。然而,缓存击穿、缓存穿透和缓存雪崩是三个常见的缓存相关问题,它们可能导致系统性能下降,甚至引发系统崩溃。本文将深入探讨这三个问题的成因、影响以及彻底的解决方案。
1372 1
|
12月前
|
缓存 NoSQL 关系型数据库
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
本文深入探讨了Redis缓存的相关知识,包括缓存的概念、使用场景、可能出现的问题(缓存预热、缓存穿透、缓存雪崩、缓存击穿)及其解决方案。
670 0
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
|
7月前
|
缓存 数据库
什么是缓存击穿 ? 怎么解决 ?
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大 解决方案 : ● 热点数据提前预热 ● 设置热点数据永远不过期。 ● 加锁 , 限流
|
11月前
|
缓存 NoSQL 数据库
缓存穿透、缓存击穿和缓存雪崩及其解决方案
在现代应用中,缓存是提升性能的关键技术之一。然而,缓存系统也可能遇到一系列问题,如缓存穿透、缓存击穿和缓存雪崩。这些问题可能导致数据库压力过大,甚至系统崩溃。本文将探讨这些问题及其解决方案。