【Redis】缓存实战解决方案--Part2 缓存穿透问题的解决思路

缓存穿透:指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求就会打到数据库

常见的解决方案有两种:

  • 缓存空对象
    • 优点:实现简单,维护方便
    • 缺点:
      • 额外的内存消耗
      • 可能造成短期的不一致

缓存空对象思路分析:当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据,此时会访问到数据库,但是数据库中也没有数据,这个数据穿透了缓存,直击数据库,我们都知道数据库能够承载的并发不如redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会访问到数据库,简单的解决方案就是哪怕这个数据在数据库中也不存在,我们也把这个数据存入到redis中去,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存了

  • 布隆过滤
    • 优点:内存占用较少,没有多余key
    • 缺点:
      • 实现复杂
      • 存在误判可能

布隆过滤:布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中,

假设布隆过滤器判断这个数据不存在,则直接返回

这种方式优点在于节约内存空间,存在误判,误判原因在于:布隆过滤器走的是哈希思想,只要哈希思想,就可能存在哈希冲突

相关推荐
张哈大4 分钟前
【 Redis | 实战篇 秒杀优化 】
java·数据库·redis·笔记·缓存
Musennn5 分钟前
MySQL多条件查询深度解析
大数据·数据库·mysql
伤不起bb3 小时前
MySQL 高可用
linux·运维·数据库·mysql·安全·高可用
Yushan Bai8 小时前
ORACLE RAC环境REDO日志量突然增加的分析
数据库·oracle
躺着听Jay8 小时前
Oracle-相关笔记
数据库·笔记·oracle
瀚高PG实验室9 小时前
连接指定数据库时提示not currently accepting connections
运维·数据库
运维成长记9 小时前
mysql数据库-中间件MyCat
数据库·mysql·中间件
尘客.10 小时前
DataX从Mysql导数据到Hive分区表案例
数据库·hive·mysql
TiDB 社区干货传送门11 小时前
从开发者角度看数据库架构进化史:JDBC - 中间件 - TiDB
数据库·oracle·中间件·tidb·数据库架构
虾球xz11 小时前
游戏引擎学习第280天:精简化的流式实体sim
数据库·c++·学习·游戏引擎