做暧嗳xo小视频网站,郑州网络营销推广机构,长沙app软件制作,dedecms 营销网站模板免费下载目录标题 缓存雪崩发生场景解决方案针对Redis宕机的缓存雪崩解决方案 缓存击穿发生场景解决方案 缓存穿透发生场景解决方案布隆过滤器 数据库和缓存数据一致性 缓存雪崩
大量缓存数据在同一时间过期#xff08;失效#xff09;或者 Redis 故障宕机时#xff0c;如果此时有大… 目录标题 缓存雪崩发生场景解决方案针对Redis宕机的缓存雪崩解决方案 缓存击穿发生场景解决方案 缓存穿透发生场景解决方案布隆过滤器 数据库和缓存数据一致性 缓存雪崩
大量缓存数据在同一时间过期失效或者 Redis 故障宕机时如果此时有大量的用户请求都无法在 Redis 中处理于是全部请求都直接访问数据库从而导致数据库的压力骤增严重的会造成数据库宕机从而形成一系列连锁反应造成整个系统崩溃这就是缓存雪崩的问题
发生场景
大量数据同时过期Redis 故障宕机
解决方案
均匀设置过期时间
如果要给缓存数据设置过期时间应该避免将大量的数据设置成同一个过期时间。我们可以在对缓存数据设置过期时间时给这些数据的过期时间加上一个随机数这样就保证数据不会在同一时间过期。
互斥锁
当业务线程在处理用户请求时如果发现访问的数据不在 Redis 里就加个互斥锁保证同一时间内只有一个请求来构建缓存实现互斥锁的时候还要加上超时时间。
后台更新缓存
业务线程不再负责更新缓存缓存也不设置有效期而是让缓存“永久有效”并将更新缓存的工作交由后台线程定时更新。
针对Redis宕机的缓存雪崩解决方案
服务熔断或请求限流机制
我们可以启动服务熔断机制暂停业务应用对缓存服务的访问直接返回错误不用再继续访问数据库从而降低对数据库的访问压力保证数据库系统的正常运行然后等到 Redis 恢复正常后再允许业务应用访问缓存服务。为了减少对业务的影响我们可以启用请求限流机制只将少部分请求发送到数据库进行处理再多的请求就在入口直接拒绝服务等到 Redis 恢复正常并把缓存预热完后再解除请求限流的机制。
构建 Redis 缓存高可靠集群
服务熔断或请求限流机制是缓存雪崩发生后的应对方案我们最好通过主从节点的方式构建 Redis 缓存高可靠集群。如果 Redis 缓存的主节点故障宕机从节点可以切换成为主节点继续提供缓存服务避免了由于 Redis 故障宕机而导致的缓存雪崩问题。
缓存击穿
发生场景 热点数据过期 当某个热点数据的缓存过期时如果此时有大量请求访问这个热点数据缓存失效的瞬间可能会导致大量请求直接访问数据库。 并发访问 当多个并发请求同时访问一个缓存中不存在但在数据库中存在的数据时如果没有合适的互斥机制会导致这些请求都落到数据库上。
如果缓存中的某个热点数据过期了此时大量的请求访问了该热点数据就无法从缓存中读取直接访问数据库数据库很容易就被高并发的请求冲垮这就是缓存击穿的问题。
解决方案
互斥锁方案保证同一时间只有一个业务线程更新缓存未能获取互斥锁的请求要么等待锁释放后重新读取缓存要么就返回空值或者默认值。不给热点数据设置过期时间由后台异步更新缓存或者在热点数据准备要过期前提前通知后台线程更新缓存以及重新设置过期时间
缓存穿透
当用户访问的数据既不在缓存中也不在数据库中导致请求在访问缓存时发现缓存缺失再去访问数据库时发现数据库中也没有要访问的数据没办法构建缓存数据来服务后续的请求。那么当有大量这样的请求到来时数据库的压力骤增这就是缓存穿透的问题
发生场景
业务误操作缓存中的数据和数据库中的数据都被误删除了所以导致缓存和数据库中都没有数据黑客恶意攻击故意大量访问某些读取不存在数据的业务
解决方案
第一种方案非法请求的限制
在 API 入口处我们要判断求请求参数是否合理请求参数是否含有非法值、请求字段是否存在如果判断出是恶意请求就直接返回错误避免进一步访问缓存和数据库。
第二种方案缓存空值或者默认值第三种方案使用布隆过滤器快速判断数据是否存在避免通过查询数据库来判断数据是否存在
布隆过滤器
布隆过滤器由「初始值都为 0 的位图数组」和「 N 个哈希函数」两部分组成。当我们在写入数据库数据时在布隆过滤器里做个标记这样下次查询数据是否在数据库时只需要查询布隆过滤器如果查询到数据没有被标记说明不在数据库中。
布隆过滤器会通过 3 个操作完成标记
第一步使用 N 个哈希函数分别对数据做哈希计算得到 N 个哈希值第二步将第一步得到的 N 个哈希值对位图数组的长度取模得到每个哈希值在位图数组的对应位置。第三步将每个哈希值在位图数组的对应位置的值设置为 1
当查询数据时只要有一个位置对应的值为0就认为不在数据库中。查询布隆过滤器说数据存在并不一定证明数据库中存在这个数据但是查询到数据不存在数据库中一定就不存在这个数据。
数据库和缓存数据一致性
先更新数据库再更新缓存会出现数据不一致的现象
先更新缓存再更新数据库也会出现数据不一致的现象
先删除缓存再更新数据库还是会出现数据不一致的现象
先更新数据再删除缓存缓存的写入通常远远快于数据库的写入