Redis缓存穿透

现象:
1、应用服务器压力变大
2、redis命中率降低
3、一直查询数据库

产生原因;
1、redis查询不到数据
2、出现很多非正常URL访问

解决方案:
1、对空值做缓存
---如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟

2、设置可访问名单(白名单)
---使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmaps里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问

3、采用布隆过滤器
---它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)

4、进行实时监控
---当发现redis的命中率开始极速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制服务

<think>好的,我现在需要回答用户关于Redis缓存穿透缓存击穿的问题。首先,我需要回忆这两个概念的定义和区别,以及它们的解决方案。根据提供的引用资料,缓存穿透是查询不存在的数据,导致直接访问数据库缓存击穿则是热点数据过期后,大量请求同时访问数据库。 接下来,我需要确认每个问题的原因。缓存穿透通常由恶意攻击或误查询引起,而缓存击穿是因为热点数据突然失效。解决方案方面,缓存穿透可以用布隆过滤器或缓存空值,缓存击穿则可以用互斥锁或永不过期策略。 然后,我需要整理结构,确保回答清晰。先分别解释两者的定义、原因和解决方案,再对比它们的区别。要注意使用中文,并正确应用LaTeX格式,比如独立公式用$$...$$,行内用$...$。同时,生成相关问题,并在引用处添加标识。最后检查是否符合用户的所有要求,包括引用正确和语法正确。</think>### Redis 缓存穿透缓存击穿对比分析 #### 一、缓存穿透 **定义** 缓存穿透指查询**数据库中不存在**的数据(如无效ID),导致每次请求绕过缓存直接访问数据库。例如:黑客使用不存在的用户ID频繁请求用户信息[^3][^4]。 **原因** 1. 恶意攻击:利用无效键发起高频查询 2. 业务误操作:程序缺陷导致生成非法查询条件 **解决方案** 1. **布隆过滤器** 使用数据结构预先存储所有合法键值,查询前进行过滤: $$ P_{\text{误判}} \approx \left(1 - e^{-kn/m}\right)^k $$ 其中$n$为元素数量,$m$为位数组长度,$k$为哈希函数数量[^3]。 2. **缓存空对象** 对无效查询结果缓存空值(设置较短过期时间): ```python def get_data(key): data = redis.get(key) if data is None: data = db.query(key) if data is None: # 数据库不存在 redis.setex(key, 300, "NULL") # 缓存空值5分钟 return None redis.setex(key, 3600, data) return data ``` #### 二、缓存击穿 **定义** 缓存击穿指**热点数据过期**时,大量并发请求同时穿透缓存直达数据库,例如:双十一商品详情页的热门商品缓存失效[^2]。 **原因** 1. 高并发场景下热点数据突然失效 2. 缓存重建耗时过长 **解决方案** 1. **互斥锁(Mutex Lock)** 仅允许一个线程重建缓存,其他线程等待: ```python def get_data(key): data = redis.get(key) if data is None: if redis.setnx("lock_" + key, 1): # 获取锁 data = db.query(key) redis.setex(key, 3600, data) redis.delete("lock_" + key) else: time.sleep(0.1) return get_data(key) # 重试 return data ``` 2. **逻辑过期时间** 数据永久存储,额外字段记录过期时间,异步更新: ```json { "value": "真实数据", "expire_time": 1717027200 # Unix时间戳 } ``` #### 三、核心差异对比 | 维度 | 缓存穿透 | 缓存击穿 | |--------------|-----------------------------------|-----------------------------------| | **数据存在性** | 数据库缓存均不存在 | 数据库存在,缓存过期[^3] | | **触发条件** | 非法/无效请求 | 热点数据集中失效 | | **攻击特征** | 可能伴随恶意攻击 | 通常为正常业务流量 | | **防御重心** | 非法请求过滤+减少数据库穿透 | 并发控制+缓存重建优化 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值