
文/邱春丽

Redis缓存简介

Redis提供了高性能的数据存取功能,所以广泛应用在缓存场景中,既能有效地提升业务应用的响应速度,还可以避免把高并发大压力的请求发送到数据库层。
把Redis用作缓存时,会把Redis部署在数据库的前端,业务应用在访问数据时,会先查询Redis中是否保存了相应的数据。
此时,根据数据是否存在缓存中,Redis缓存处理请求分为以下两种情况:
缓存命中:Redis中有相应数据,就直接读取Redis,性能非常快。
缓存缺失:Redis中没有保存相应数据,就从后端数据库中读取数据,性能就会变慢。
而且,一旦发生缓存缺失,为了让后续请求能从缓存中读取到数据,需要把缺失的数据写入Redis,这个过程叫作缓存更新。



Redis做缓存可以减轻数据库的压力,但其常见如下四个缓存问题。
缓存雪崩是指大量的应用请求无法在Redis缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。

缓存雪崩可能由两个原因导致:
原因1:在某个时间点内,缓存中大量数据同时过期
解决方法:
1. 避免给大量数据设置相同过期时间,可以通过设置不同的过期时间,来错开缓存过期,从而避免缓存集中失效。
2. 服务降级:当业务应用访问的是非核心数据时,暂时停止从缓存中查询这些数据,而是直接返回预定义信息、空值或是错误信息;
当业务应用访问的是核心数据时,仍然允许查询缓存,如果缓存缺失,也可以继续通过数据库读取。
原因2:Redis缓存实例发生故障宕机或其他异常无法提供服务。
解决方法:
1. 在业务系统中实现服务熔断或请求限流机制。
服务熔断即暂停业务应用对缓存系统的接口访问,等到Redis缓存实例重新恢复服务后,再允许应用请求发送到缓存系统。
请求限流指业务系统的请求入口前端控制每秒进入系统的请求数,避免过多的请求被发送到数据库。
2. 事前预防
如果缓存层设计成高可用的,即使个别节点、个别机器宕掉,依然可以提供服务,例如Redis Sentinel和Redis Cluster都实现了高可用。
缓存击穿是指针对某个访问非常频繁的热点数据的请求,无法在缓存中进行处理,紧接着,访问该数据的大量请求一下子都发送到了后端数据库,导致了数据库压力激增,会影响数据库处理其他请求。

缓存击穿的情况,经常发生在热点数据过期失效时。
解决方法:
为了避免缓存击穿给数据库带来的激增压力,对访问特别频繁的热点数据,可以不设置过期时间。
这样对热点数据的访问请求,都可以在缓存中进行处理,而Redis数万级别的高吞吐量可以很好地应对大量的并发请求访问。
缓存穿透是指要访问的数据既不在Redis缓存中,也不在数据库中。
导致请求在访问缓存时,发生缓存缺失,再去访问数据库时,数据库中也没有要访问的数据。
此时,应用也无法从数据库中读取数据再写入缓存来服务后续请求,这样一来,缓存也就成了“摆设”。
如果应用持续有大量请求访问数据,就会同时给缓存和数据库带来巨大压力。

缓存穿透一般由两种情况导致:
原因1:业务层误操作,例如缓存中的数据和数据库中的数据被误删除了,所以缓存和数据库中都没有数据。
解决方法:
1. 缓存空值或缺省值
一旦发生缓存穿透,我们可以针对查询的数据,在Redis中缓存一个空值或是和业务层协商确定的缺省值,这样第二次到缓存中获取就有值了,不会继续访问数据库。
2. 使用布隆过滤器快速判断数据是否存在,避免从数据库中查询数据是否存在,减轻数据库压力。
原因2:恶意攻击造成的缓存穿透
解决方法:
1. 前端进行请求的合法性检测
2. 封禁恶意ip
在一些场景下,有些数据被访问的次数非常少,甚至只会被访问一次。
当这些数据服务完访问请求后,如果还继续留存在缓存中的话,就只会白白占用缓存空间,这种情况,就是缓存污染。
当缓存污染不严重时,对缓存系统影响不大,但是缓存污染一旦变严重,再往缓存中写入新数据时,就要先把这些数据逐步淘汰出缓存,这就会引入额外的操作时间开销,进而会影响应用性能。
解决缓存污染问题的关键点是能把只访问过一次或者访问次数很少的数据筛选出来并淘汰掉,这样就不用等到缓存写满后再淘汰进而写入数据了。通常结合缓存淘汰策略来解决缓存污染。
1. 首先需要设置最大内存限制,eg:maxmemory 100mb
2. 选择淘汰策略,eg: maxmemory-policy allkeys-lru
Redis有八种数据淘汰策略,都会按照一定的规则来淘汰数据,但这八种淘汰策略对于缓存污染不一定都有效。

综合以上对Redis缓存八种淘汰策略分析可知,volatile-ttl、volatile-lfu和allkeys-lfu这三种缓存策略能解决缓存污染问题,noeviction策略不能解决缓存污染,而其他策略解决有限。


顾问:许国平 李湘宜
罗学平 刘德清 张刚
总编:孙鹏晖
编辑:段晗
美编:郎贤美

长按二维码,关注我们吧!

-本文为“数风云”第31期文章;
-转载本公众号文章请联系我们;
-欢迎来稿:请按“题目-作者”格式命名发送到sunpenghui@abchina.com。





