缓存穿透cache

缓存穿透是指恶意请求绕过缓存直接访问数据库,导致数据库压力剧增。为解决此问题,可以采用布隆过滤器,这是一种概率型数据结构,能有效拦截可能不存在的数据查询,防止数据库被无效请求淹没。布隆过滤器虽然不支持删除操作,但能降低数据库被大量无效请求冲击的风险,确保系统稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缓存

在这里插入图片描述

缓存只是为了缓解数据库压力而添加的一层保护层,当从缓存中查询不到我们需要的数据就要去数据库中查询了。如果被黑客利用,频繁去访问缓存中没有的数据,那么缓存就失去了存在的意义,瞬间所有请求的压力都落在了数据库上,这样会导致数据库连接异常。

穿透效果

在这里插入图片描述

如果同一时间有大量请求进行访问,缓存中不存在的数据,就会越过缓存直接访问数据,大量访问数据库会对数据库造成巨大负担,甚至使得数据库挂掉。

解决方案

布隆过滤器

布隆过滤器是一种概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”.
并不适用于删除。

只要我们可以验证缓存中不存在的就直接禁止让他穿透缓存。

### 什么是缓存穿透 缓存穿透指的是客户端发起的查询请求未能在缓存中找到对应的数据,进而这些未命中的请求直接访问底层存储系统(如数据库),如果此类情况频繁发生,则可能导致后端服务负载过高,影响性能乃至稳定性[^1]。 ### 缓存穿透的原因 造成缓存穿透的主要因素在于某些恶意攻击者故意构造不存在于缓存内的键值进行大量读取操作;或是应用程序逻辑缺陷使得部分本应存在于缓存里的数据缺失。另外,对于确实不存在的数据项,每次查询都会绕过缓存直达数据库验证其存在性也会引发此现象[^4]。 ### 解决方案概述 为了应对上述挑战,可采取如下措施: #### 存储空结果并设定短暂有效期 当检测到特定key对应的value为空时,不是立即返回错误而是将其作为一个特殊的“null”记录写入缓存,并赋予较短的有效期限(通常不超过几分钟)。这样做的好处是可以减少短期内重复对该条目执行相同查找所带来的开销。 ```python import redis from datetime import timedelta def get_with_cache(redis_client, key): value = redis_client.get(key) if not value: # 假设db_get是从数据库获取数据的方法 db_value = db_get(key) if db_value is None: # 如果数据库里也没有该数据,则向redis插入一条带有TTL的时间戳为当前时间加上指定秒数(这里假设为300s即5分钟)的NULL字符串表示这条数据确实不存在. redis_client.setex(key, timedelta(seconds=300), 'NULL') return None redis_client.setex(key, timedelta(hours=1), db_value) return db_value elif value.decode('utf-8') == 'NULL': return None return value.decode('utf-8') ``` #### 使用布隆过滤器预筛选 通过引入布隆过滤器来提前判断某个key是否存在,只有确认存在的才会继续尝试从缓存数据库加载实际内容。这种方法能够有效地拦截掉大部分根本就不可能存在的查询请求,从而减轻服务器负担[^2]。 ### 预防措施总结 除了以上提到的技术手段外,还应该注意合理规划缓存机制的设计原则,比如避免使用容易被猜测出来的简单模式命名缓存Key,以及定期清理不再使用的陈旧缓存项目等做法也有助于降低遭遇缓存穿透的风险[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值