Redis缓存穿透、缓存雪崩、缓存击穿好好说说 (2)

既然说Redis,就说Redis的布隆过滤器吧,其实小伙伴可以根据自己的需求利用Redis的bitmap实现。那有没有造好的轮子呢,当然有,在Redis4.0开始就有一个布隆过滤器的组件,开箱即用,当然也有一些其他大佬封装的,基于内存的,基于分布式都有。这里简单说说Redis布隆过滤器的插件,个人觉得挺好的,推荐哦。

官方文档地址:https://oss.redislabs.com/redisbloom/

我这面是用centos进行演示,主要步骤如下:

如果没有git的需要安装一下;如果不用git就去下载代码压缩包;

yum install -y git

把redis布隆过滤器的源码搞下来,这里用git;也可以通过下载的方式;

git clone https://github.com/RedisLabsModules/redisbloom.git

进入代码目录进行make(生成redisbloom.so文件),如果make命令找不到,就需要安装VC++编译相关的包;

cd redisbloom make

在Redis配置文件中配置加载redisbloom插件,然后重启就可以用啦;也可以启动的时候指定加载插件运行;

配置文件方式式:在配置文件中添加如下配置,需要指定redisbloom.so具体的文件位置。

image-20210226112615246

然后指定配置文件启动即可;

./redis-server redis.conf

启动时指定模块运行方式:

./redis-server --loadmodule ./redisbloom.so

简单使用

image-20210226121208096

命令使用和常规命令一样啦,就不需要我再写程序了吧,如果非要的话,那就简单说两句:

A.将需要判断数据保存在过滤器中,比如所有的用户id;

B.当请求过来时就先从过滤器中判断有无数据,没有直接返回,不去缓存,也不去数据库;

C.如果有新添加的用户,需要将新的用户id放到过滤器中;

关于Redis布隆过滤器还有一些命令没说,小伙伴可以去逛逛官网。有小伙伴说,不用这个插件行吗,当然行啊,可以自己实现嘛,不过有些小伙伴有封装好的包啦,有基于内存的,也有基于Redis的,如下图:

image-20210226122058230

代码我就不上了,剩下的就留给小伙伴啦。

2. 缓存雪崩 1.1 简要描述

缓存雪崩是指突然缓存层不可用,导致大量请求直接打到数据库,最终由于数据库压力过大可能导致系统崩掉。缓存层不可用指以下两方面:

缓存服务器宕机,系统将请求打到数据库;

缓存数据突然大范围集中过期失效,导致大量请求打到数据库重新加载数据;

如图:

image-20210226122232085

简要说明:

缓存Redis服务器颜色说明:绿色块代表有缓存数据,粉色块代表缓存中没有数据;白色块代表大范围失效的缓存数据,绿色箭头代表直接从缓存中获取数据;黄色箭头代表穿过缓存从数据库中查数据。

流程大概如下:

大量客户端发起大量请求到服务器;

服务器代码逻辑将先经过缓存,如果有缓存数据(绿色部分),直接从缓存中获取数据数据返回;如果缓存过期(白色块部分),请求就会直接打到数据库服务器(如黄色箭头)

如果存在大量热数据的请求,但热数据又大范围过期,最终数据库将因为过大压力崩掉,导致系统不可用。

1.2 常用解决措施

缓存预热:在高峰期还没到来时,提前将热数据加载到缓存中,避免高峰期来临时数据库压力过大。

均匀设置过期时间:针对不同的热点数据,将过期时间加上一个随机值,让过期时间不集中在一个点,从而减小很大部分数据库压力;

多级缓存:除了使用Redis缓存,还可以根据业务增加一些热点数据的其他缓存,比如内存缓存,可以将各级的缓存有效期分开,这种方式也能缓解数据库的压力;

限流、降级:如果压力过大,避免把系统搞崩,可以增加一些限流手段,不管是中间件还是消息队列等,主要保证系统的可用。

加互斥锁:目的就是加锁独占操作,让一个操作向缓存中重新加载数据,让请求操作等待,其实这样的体验不好,慎用。如果要用,要超级注意锁的性能和稳定性。

对于缓存层整体崩掉的情况:使用高可用架构,比如之前说到的主从复制、哨兵、集群,根据需求进行对应架构,保证缓存层不崩掉。

3. 缓存击穿 1.1 简要描述

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpysgg.html