开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天,点击查看活动详情
redis缓存相关知识
前文
本文主要的内容是关于redis作为缓存服务器的使用,包括常见的击穿、穿透、雪崩,以及缓存搭配数据库时的数据一致性问题。
缓存的击穿、穿透、雪崩
缓存击穿
缓存击穿是redis作为缓存时常见的一种现象,具体指的是当进行缓存的访问时,redis中的缓存数据不存在,导致请求直接访问到数据库中,对数据库造成了压力。对于缓存击穿,解决方案一般是增加锁处理,避免当缓存不存在时,数据直接进行数据库的请求,或保持数据在redis中不存在过期时间,通过业务逻辑进行缓存数据的更新。
缓存穿透
缓存穿透是指在缓存击穿的情况下,数据库中同样没有查询到对应的数据,也就是可能是业务系统的数据问题或出现了黑客的攻击等等。对于缓存穿透的解决方案,我们可以进行非法请求的校验,以及当出现缓存穿透时,进行穿透数据的短时间缓存,来保证数据库不会受到大流量攻击。
缓存雪崩
缓存雪崩可以认为是缓存击穿的高级版,指的是同一时间大量的数据全部发生缓存失效,也就是大量请求直接打到数据库。针对这种情况,我们可以对于数据的缓存超时时间进行差异化处理,避免同一时刻大量的数据同时发生缓存失效。当然,也可以类似于缓存击穿的处理方法,保证redis中的缓存不会失效,而是通过业务逻辑进行缓存数据的更新。
缓存和数据库的数据一致性
下面来说一下有关redis缓存数据一致性的问题。当我们需要更新缓存中的数据时,应该如何处理呢?一般有以下的几种方案。
- 先更新数据库,再更新缓存。对于这种方式,当多个线程并发执行时,可能会发生先更新数据库的线程后更新缓存,需要加锁才能保证数据为最新。
- 先更新缓存,再更新数据库。对于这种方式和上一种是类似的,并发情况下不能保证数据为最新,需要加锁避免。
- 先更新数据库,再删除缓存。对于这种方式,可能出现线程查询到无数据,从数据库中准备写入缓存,此时另一个线程删除缓存并进行数据库的更新,前面的线程此时写入缓存。这种方式理论上可能存在并发问题,但实际上该方式写入缓存的速度要快于写入数据库的速度,也就是可以认为两者数据近似保持了一致性。
- 先删除缓存,再更新数据库。这种方式可能出现两个线程同时执行时,后到达的线程先更新了缓存,也就是缓存和数据库的数据出现不同。
总结
本文主要内容对于redis作为缓存的场景中,可能出现的缓存击穿、缓存穿透和缓存雪崩等进行了含义及解决方案的介绍,同时对redis和数据库的缓存一致性问题进行了分析。