游戏开发工具

概述

当用户想要查询一个数据,发现Redis中不存在,也就是所谓的缓存没有命中,于是这个数据请求就会打到数据库中,结果数据库中也不存在这条数据,那么结果就是什么都没查询出来。

那么当用户很多时候的查询,缓存中都没有数据,请求直接打到数据库中,这样就会给数据库造成很大的压力,缓存的作用也就几近于失效了,那么这种情况就叫做缓存穿透。


解决方案

方案一:保存空值

当数据库中也查询不到数据时,那么将返回的空对象也缓存起来,同时设置一个过期时间,之后再访问这个数据将会从缓存中获取,从而起到保护数据库的作用。

例如:查询userId=100的用户信息(key=[userId],value=[用户json]),那么如果缓存和DB中都不存在,则在缓存中保存一条key=100,value=""的数据,那么用户再查询userId=100的时候,就直接可以返回空了。不需要查询DB。


方案二:布隆过滤器

步骤1:将数据库所有的数据加载到布隆过滤器。

步骤2:当有请求来的时候先去布隆过滤器查询,判断查询的数据是否存在。

步骤3:如果Bloom Filter判断数据不存在,那么直接返回空给客户端。

步骤4:如果Bloom Filter判断数据存在,那么则查询缓存或DB。

步骤5:将DB中查询的结果返回给客户端(并且缓存到Redis中)

1.jpg