Redis1-雪崩、击穿、穿透

1.原因

1.雪崩:大量数据同时过期、或者 Redis故障

2.击穿:某个热点数据过期,高并发请求时在缓存中找不到,就会访问数据库,数据库崩溃

3.穿透:数据不在缓存,也不在数据库中

2.雪崩解决方案

大量数据同时过期

1.均匀设置过期时间

将数据的过期时间加上一个 随机值,防止大量数据在同一时期过期

2.互斥锁

一个线程在访问数据的时候,如果发现数据不在redis里,就加个互斥锁,保证同一时间只有一个线程构建缓存(构建缓存就是,从数据库里读数据,放到redis缓存中),然后释放锁。如果那些没有抢到锁的线程,要么等待锁释放之后重新读取缓存,要么返回空值或者默认值。

实现互斥锁的时候,要加一个超时时间,因为万一这个线程在构建缓存的时候发生了故障,然后一直阻塞,一直不释放锁,就会影响其他的线程。

3.双key策略

一个主key,设置过期时间,一个备key,不设置过期时间,它们对应的 value 都是一样的。线程访问不到主key对应的数据的时候,就会访问备key的数据。

在跟新缓存的时候,同时更新主、备key的数据

4.后台线程更新缓存

业务线程不再用来更新缓存,数据也不设置过期时间,缓存永久有效,缓存的更新操作又后台线程定时完成。

但是这个缓存也不是永久有效的,如果内存紧张,就会淘汰部分缓存,线程访问的时候就会以为数据丢失了

解决有两种:1.后台线程负责定时更新缓存,的同时,也负责频繁检测缓存是否失效,发现就更新 2.业务线程发现缓存失效后,通过消息队列发送消息通知后台线程,然后后台线程更新缓存

后台更新缓存机制适合缓存预热,也就是提前把数据缓存起来,不等用户访问才触发缓存

redis故障宕机

1.服务熔断或访问数据库限流

因为redis故障,会导致大量请求访问数据库,造成数据库崩溃。所以redis故障之后,可以服务熔断,暂停业务访问,直接返回错误,从而不用再对数据库进行访问。等redis正常之后,在允许访问缓存。

也可以请求限流,只允许少量请求访问数据库,再多的请求就直接拒绝服务

2.构建redis缓存高可靠集群

通过主从节点的方式构建集群。redis主节点宕机,从节点切换为主节点,继续提供服务

3.击穿解决方案

1.互斥锁

2.后台更新缓存

4.穿透解决方案

1.限制非法请求

API入口判断请求参数是否合理,是否含有非法值,如果是恶意请求就直接返回错误。避免进一步访问缓存和数据库。

2.缓存空值或者默认值

3.布隆过滤器快速判断数据是否存在,避免通过查询数据库来判断是否存在

1.根据n个哈希函数计算n个哈希值

2.根据n个哈希值对数组长度取模,得到n个索引位置

3.将n个索引位置的值设成1

想要知道是否在数据库中,只需要查询布隆过滤器中就可以,n个位置全是1,说明在,只要有1个0,就认为不在数据库中。

可能出现误判的情况,因为别的数据也可能在这n个索引位置有值,所以

查询布隆过滤器说数据存在,在数据库中不一定真的存在,在布隆过滤器中说数据不存在,那在数据库里一定不存在

也就是布隆过滤器说不存在,那在数据库中就真的不存在,布隆过滤器说存在,那数据库里可能存在。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值