当查询redis中没有的数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,当这种情况大量出现或被恶意攻击时,接口的访问全部透过Redis访问数据库,而数据库中也没有这些数据,我们称这种现象为"缓存穿透" 。缓存穿透会穿透Redis的保护,提升底层数据库的负载压力,同时这类穿透查询没有数据返回也造成了网络和计算资源的浪费 。
文章插图
【缓存穿透解决方案】解决方案:
- 在接口访问层对用户做校验,如接口传参、登陆状态、n秒内访问接口的次数;
- 利用布隆过滤器,将数据库层有的数据key存储在位数组中,以判断访问的key在底层数据库中是否存在;
基于布隆过滤器,我们可以先将数据库中数据的key存储在布隆过滤器的位数组中,每次客户端查询数据时先访问Redis:
- 如果Redis内不存在该数据,则通过布隆过滤器判断数据是否在底层数据库内;
- 如果布隆过滤器告诉我们该key在底层库内不存在,则直接返回null给客户端即可,避免了查询底层数据库的动作;
- 如果布隆过滤器告诉我们该key极有可能在底层数据库内存在,那么将查询下推到底层数据库即可;
文章插图
布隆过滤器有误判率,虽然不能完全避免数据穿透的现象,但已经可以将99.99%的穿透查询给屏蔽在Redis层了,极大的降低了底层数据库的压力,减少了资源浪费 。
推荐阅读
- .NET桌面程序集成Web网页开发的多种解决方案
- Asp.Net在线预览Word文档的解决方案与思路
- 电脑声音不正常怎么办?计算机异常声音的解决方案
- CSRF、XSS攻防原理及解决方案
- RFID防伪溯源解决方案
- 如何通过免费的内网穿透工具,让外网访问你本地的服务器?
- 什么是redis的缓存雪崩,穿透,击穿?
- 谷歌 Chrome 浏览器将支持“往返缓存”,网页恢复速度大提升
- VPN解决方案的需求大幅激增
- 移动WebApp高性能解决方案——MIP