网站开发app开发,如何做网站推广方式,网站关键字 怎么设置,wordpress文章表单什么是缓存雪崩
通常我们为了保证缓存中的数据与数据库中的数据一致性#xff0c;会给 Redis 里的数据设置过期时间#xff0c;当缓存数据过期后#xff0c;用户访问的数据如果不在缓存里#xff0c;业务系统需要重新生成缓存#xff0c;因此就会访问数据库#xff0c;并…什么是缓存雪崩
通常我们为了保证缓存中的数据与数据库中的数据一致性会给 Redis 里的数据设置过期时间当缓存数据过期后用户访问的数据如果不在缓存里业务系统需要重新生成缓存因此就会访问数据库并将数据更新到 Redis 里这样后续请求都可以直接命中缓存。 那么当大量缓存数据在同一时间过期失效或者 Redis 故障宕机时如果此时有大量的用户请求都无法在 Redis 中处理于是全部请求都直接访问数据库从而导致数据库的压力骤增严重的会造成数据库宕机从而形成一系列连锁反应造成整个系统崩溃这就是缓存雪崩的问题。 缓存雪崩的原因
可以看到发生缓存雪崩有两个原因
大量数据同时过期Redis 故障宕机
不同的诱因应对的策略也会不同。 大量数据同时过期
针对大量数据同时过期而引发的缓存雪崩问题常见的应对方法有下面这几种
均匀设置过期时间互斥锁后台更新缓存
1. 均匀设置过期时间
如果要给缓存数据设置过期时间应该避免将大量的数据设置成同一个过期时间。我们可以在对缓存数据设置过期时间时给这些数据的过期时间加上一个随机数这样就保证数据不会在同一时间过期。
2. 互斥锁
当业务线程在处理用户请求时如果发现访问的数据不在 Redis 里就加个互斥锁保证同一时间内只有一个请求来构建缓存从数据库读取数据再将数据更新到 Redis 里当缓存构建完成后再释放锁。未能获取互斥锁的请求要么等待锁释放后重新读取缓存要么就返回空值或者默认值。
实现互斥锁的时候最好设置超时时间不然第一个请求拿到了锁然后这个请求发生了某种意外而一直阻塞一直不释放锁这时其他请求也一直拿不到锁整个系统就会出现无响应的现象。
3. 后台更新缓存
业务线程不再负责更新缓存缓存也不设置有效期而是让缓存“永久有效”并将更新缓存的工作交由后台线程定时更新。
事实上缓存数据不设置有效期并不是意味着数据一直能在内存里因为当系统内存紧张的时候有些缓存数据会被“淘汰”而在缓存被“淘汰”到下一次后台定时更新缓存的这段时间内业务线程读取缓存失败就返回空值业务的视角就以为是数据丢失了。
解决上面的问题的方式有两种。
第一种方式后台线程不仅负责定时更新缓存而且也负责频繁地检测缓存是否有效检测到缓存失效了原因可能是系统紧张而被淘汰的于是就要马上从数据库读取数据并更新到缓存。
这种方式的检测时间间隔不能太长太长也导致用户获取的数据是一个空值而不是真正的数据所以检测的间隔最好是毫秒级的但是总归是有个间隔时间用户体验一般。
第二种方式在业务线程发现缓存数据失效后缓存数据被淘汰通过消息队列发送一条消息通知后台线程更新缓存后台线程收到消息后在更新缓存前可以判断缓存是否存在存在就不执行更新缓存操作不存在就读取数据库数据并将数据加载到缓存。这种方式相比第一种方式缓存的更新会更及时用户体验也比较好。
在业务刚上线的时候我们最好提前把数据缓起来而不是等待用户访问才来触发缓存构建这就是所谓的缓存预热后台更新缓存的机制刚好也适合干这个事情。