在日常的工作中,Redis最常用的场景就是缓存场景,为什么Redis能作为缓存呢?
系统中,不同层访问速度不一样,缓存一定是一个快速子系统,在一些业务场景中,我们把频繁访问的数据放在缓存中,就是为了避免从慢速子系统中存取数据,加快数据的访问速度:
把Redis用作缓存时,我们会把Redis部署在数据库的前端,业务应用在访问数据时,会先查询Redis中是否保存了相应的数据,所以,使用Redis缓存会有两种情况:
Redis提供了8种淘汰策略(包括Redis4.0之后的2种新策略)可以分为三类:
其中Redis默认策略是noeviction,也就是说,如果Redis缓存被写满了,Redis就不再提供服务,直接返回错误,显然这种策略不是很适合部分业务。
如果在设置了过期时间的数据中淘汰:
如果在所有数据范围内进行淘汰:
Redis作为缓存经常会出现缓存异常的问题,其中最常见的有是那种,就是缓存雪崩、缓存击穿和缓存穿透。一旦发生这三种问题,大量的请求就会积压在数据库层,如果是高并发的业务,可能会导致数据库宕机,引发生产事故。
缓存雪崩指的是大量的应用请求无法在Redis缓存中进行处理,应用将大量请求发送到数据库,导致数据库压力骤增,一般由于两个原因导致:
解决问题1可以采用以下两种方式:
解决问题2可以采用以下三种方式:
缓存击穿指的是针对某个访问非常频繁的热点数据的请求,无法在缓存中进行处理,紧接着,访问该数据的大量请求,一下子都发送到了后端数据库,导致了数据库压力激增。如果出现这个问题也很好解决,如果是非常热点的数据,就不设置过期时间,同时调整淘汰策略,保证缓存不被击穿即可。
缓存穿透是指要访问的数据既不在 Redis 缓存中,也不在数据库中,导致请求在访问缓存时,发生缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据。如果应用持续有大量请求访问数据,就会同时给缓存和数据库带来巨大压力。缓存穿透一般由于两个原因导致:
针对这两种原因,可以有以下的三种方式来解决: