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

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

什么是缓存穿透

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

过程:

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

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

常见场景

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

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

预防措施

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

1.缓存空数据

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

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

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

2.布隆过滤器拦截

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

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

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

存在问题:维护复杂,建议只在海量数据的情况下使用。

阿里云MySQL及Redis灵异断连现象:安全组静默丢包解决方法

Redisclientlibrary连接Redisserver超时差不多一两年前,在阿里云上遇到一个奇怪的Redis连接问题,每隔十来分钟,服务里的Redisclient库就报告连

数据库大师成长日记:再谈MySQL和SQLServer的差别

MySQL和MSSQL,应该是我们开发系统最常用的两种后台数据库了。今天多列举一些细微的区别,希望对那些对两个数据库都有兴趣的朋友有所帮助。