深圳龙岗区布吉街道,太原网站优化教程,网站建设 浙icp 0578,电商论坛前言
Redis 作为一门热门的缓存技术#xff0c;引入了缓存层#xff0c;就会有缓存异常的三个问题#xff0c;分别是缓存击穿、缓存穿透、缓存雪崩。我们用本篇文章来讲解下如何解决#xff01;
缓存击穿
缓存击穿: 指的是缓存中的某个热点数据过期了#xff0c;但是此…前言
Redis 作为一门热门的缓存技术引入了缓存层就会有缓存异常的三个问题分别是缓存击穿、缓存穿透、缓存雪崩。我们用本篇文章来讲解下如何解决
缓存击穿
缓存击穿: 指的是缓存中的某个热点数据过期了但是此时大量的并发请求访问这个key的值此时因为缓存过期无法从缓存中获取直接访问数据库数据库很容易就会被这些高并发的请求冲垮这就是缓存击穿。
解决方案
热点数据不要设置过期时间或者在热点数据即将要过期前提前通过后台线程更新缓存以及重新设置过期时间互斥锁方案如果该key的数据更新了那么就通过互斥锁的方式将其更新。
缓存穿透
缓存穿透假如用户访问的数据既不在缓存中也不在数据库。于是请求在访问缓存时发现缓存没有命中继续访问数据库发现数据库中也没有对应的key值。当有大量这样的并发请求到来时数据库的压力激增这就是缓存穿透。 如上图红框所示一般缓存穿透是遭遇了恶意请求或者业务误删缓存跟数据库导致缓存和数据库中都没有数据。
应对缓存穿透一般是下面两种方案。
1. 缓存空值或者默认值
出现缓存穿透的现象时我们可以针对查询的数据在缓存中设置一个空值或者默认值这样后续请求就可以从缓存中读取到空值或者默认值从而不会继续查询数据库。
2. 使用布隆过滤器推荐
布隆过滤器是一种数据结构更准确的说是一种概率型的数据结构因为它能判断某个元素一定不存在或者是可能存在。
在写入数据库数据时使用布隆过滤器做个标记然后在用户请求到来时业务线程确认缓存失效后可以通过查询布隆过滤器快速判断数据是否存在如果不存在就不用通过查询数据库来判断数据是否存在。
缓存雪崩
通常为了保证缓存中的数据与数据库中的数据一致性我们会给 Redis 里的数据设置过期时间当缓存数据过期后用户访问的数据无法命中缓存业务系统需要重新生成缓存因此就会访问数据库并将数据更新到 Redis 里。 缓存雪崩: 就是指在大量的应用请求无法在 Redis 缓存中进行处理然后应用将大量请求发送到数据库层导致数据库层的压力骤增。 一般是以下两种情况导致的
缓存中的大量数据在同一时间过期导致大量请求无法得到处理。Redis 缓存实例发生故障宕机了无法处理请求导致大量请求一下子积压到数据库层面
大量数据同时过期
解决方案 过期时间添加随机数 首先我们要避免给大量的数据设置相同的过期时间。如果业务真的有这个需求我们可以在用 EXPIRE 命令给每个数据设置过期时间时给这些数据的过期时间增加一个较小的随机数既能避免了大量数据同时过期又保证了这些数据基本在相近的时间失效依然能满足业务需求。 互斥锁 当业务线程在处理用户请求时如果发现访问的数据不在 Redis 里就加个互斥锁保证同一时间内只有一个请求来构建缓存当缓存构建完毕后再释放锁。未能获取互斥锁的请求要么等待锁释放后重新读取缓存要么就返回空值或者默认值。
Redis 故障宕机
解决方案
服务熔断或请求限流 发生缓存雪崩时为了防止引发连锁的数据库雪崩甚至是整个系统的崩溃我们暂停业务应用对缓存系统的接口访问。具体点说就是业务应用调用缓存接口时缓存客户端并不把请求发给 Redis 缓存实例而是直接返回等到 Redis 缓存实例重新恢复服务后再允许应用请求发送到缓存系统。
为了减少对业务的影响我们可以启用请求限流机制只将少部分请求发送到数据库进行处理再多的请求就在入口直接拒绝服务等到 Redis 恢复正常并把缓存预热完后再解除请求限流的机制。
构建 Redis 缓存高可靠集群 如果 Redis 缓存的主节点故障宕机了从节点可以切换成为主节点继续提供缓存服务避免了由于缓存实例宕机而导致的缓存雪崩问题。
总结
关于缓存中常见的三个线上问题我们总结了原因以及解决方案希望能够帮助可能在线上使用缓存的开发工程师们未雨绸缪