什么是缓存穿透如何防止

缓存穿透是指客户端请求的数据在缓存中不存在,需要直接查询数据库,这种现象称为缓存穿透。在高并发的情况下,大量的请求同时查询不存在的数据,会导致数据库压力过大,甚至可能导致数据库崩溃。

缓存穿透的原因:


恶意攻击:攻击者故意请求不存在的数据,导致大量请求直接访问数据库。

业务逻辑错误:客户端请求的数据在系统中根本不存在,如错误的用户ID、不存在的商品ID等。

数据更新:数据在数据库中存在,但在缓存中不存在,可能是由于缓存失效或数据更新不及时导致的。

防止缓存穿透的措施:


缓存空值:当数据库查询结果为空时,仍然在缓存中设置一个空值或特殊的标识,这样后续的请求会直接命中缓存,而不会查询数据库。

布隆过滤器:使用布隆过滤器快速判断一个数据是否存在于数据库中,如果布隆过滤器判断数据不存在,则直接返回,不查询数据库。

限流:对请求进行限流,限制每秒处理的请求数量,防止大量请求同时访问数据库。

数据校验:在客户端对请求的数据进行校验,如检查用户ID是否合法,商品ID是否存在等,过滤掉不合法的请求。

异步更新缓存:当数据库中的数据发生变化时,异步更新缓存,减少缓存与数据库之间的不一致性。

分布式锁:对于写请求,使用分布式锁确保同一时刻只有一个请求可以访问数据库,避免大量写请求同时操作数据库。

缓存穿透是分布式缓存系统中常见的问题,需要通过合理的缓存策略和系统设计来避免

### Redis 缓存穿透概念 缓存穿透指的是客户端请求的数据既不在缓存中也不在数据库中存在的现象。这种情况下,每次请求都会直接访问数据库,使得缓存失去作用[^2]。 当存在恶意请求时(例如攻击者故意频繁请求不存在的数据),这会引发大量不必要的查询操作,增加数据库负载,甚至可能导致数据库崩溃或显著降低服务性能[^3]。 ### 应对策略 #### 1. 使用布隆过滤器(Bloom Filter) 布隆过滤器是一种空间效率极高的随机化数据结构,它用于测试一个元素是否属于某个集合。对于 Redis 来说,在查询之前先通过布隆过滤器判断该 key 是否可能存在: - 如果布隆过滤器返回 false,则表示此键肯定不存在于数据库中; - 若返回 true,则继续检查 Redis 和 数据库;注意此时仍有可能是误判。 这种方法能有效减少因非法参数带来的无谓查找次数,减轻后端系统的压力[^4]。 ```python import pybloom_live bf = pybloom-live.BloomFilter(capacity=100000, error_rate=0.001) # 添加已知存在的key到布隆过滤器中... if not item in bf: # Key 肯定不存在的情况处理逻辑 else: # 可能在Redis/DB里找这个Key... ``` #### 2. 设置默认值或空对象缓存 对于确实不存在的数据项,可以在第一次确认其不存在之后将其设置为空字符串或其他特殊标记存储至缓存层一段时间。这样后续相同的查询可以直接由缓存响应而无需再查问底层持久化存储[^1]。 ```bash SET non-existent-key "" EX 60 ;// 将不存在的key设为空串并指定过期时间为60秒 ``` #### 3. 参数校验与权限控制 加强前端输入验证以及 API 接口的安全防护措施,防止外部提交异常参数进入内部流程。比如采用正则表达式匹配、范围限定等方式提前拦截不合理请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值