常见的Redis架构设计缺陷-缓存穿透

什么是缓存穿透

所谓的缓存穿透,简单来讲就是查询某些不存在的key时,缓存和数据库查询结果都为空,而空的结果又不被缓存起来,而导致每次查询都去请求数据库层的情况。

过程:

缓存不命中,进而导致每次查询都去查询数据库,缓存也就失去了作用,通常表现为服务器负载迅速上升,严重时可能直接宕机。

常见场景

日常网站开发中,我们通常会将一些访问频繁的页面缓存起来,比如文章详情页、商品详情页等,而这些又恰恰是爬虫最喜欢访问的页面,如果缓存设计不合理,遇到不负责任的爬虫,顺着ID频繁抓取数据,后果是非常严重的!

另外,有很多同学写代码时不够细心,特别是循环去调用某些接口时容易出现缓存的情况,有时候威力堪比恶意攻击(泪奔)。

预防措施

常见的两种方法是缓存空数据和使用布隆过滤器,需要根据实际场景进行选择。

1.缓存空数据

当第一次查询数据库时,若数据不存在,返回空数据时将其写入缓存,后续查询就不必再去查询数据库了。

存在问题:如果key过期时间较长,出现恶意攻击时,容易出现内存不够的情况。另外,需要额外的业务逻辑处理数据库与缓存中数据一致性的问题。

2.布隆过滤器拦截

访问缓存之前,先从布隆过滤器中验证数据是否存在。

简单来讲就是使用多个hash函数将一个key映射到一个很长的二进制向量的多个比特位中,类似于hash set。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180404A0XC6I00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券