REDIS缓存的常见问题

缓存穿透问题

概念:缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决方案:

1.接口层增加校验,如用户鉴权校验,id 做基础校验,id<=0 的直接拦截;

2.从缓存取不到的数据,在数据库中也没有取到,这时也可以将 key-value 对写为 key-null,缓存有效时间可以设置短点,如 30 秒(设置太长会导 致正常情况也没法使用)。这样可以防止攻击用户反复用同一个 id 暴力攻击。

3.采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的据会被这个 bitmap 拦截掉,从而避免了对底层 存储系统的查询压力。

缓存击穿问题

概念:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由 于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数 据库压力瞬间增大,造成过大压力。和缓存雪崩不同的是,缓存击穿指并发查同 一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:

1.设置热点数据永远不过期。

2.加互斥锁,互斥锁

缓存雪崩问题

概念:缓存雪崩指的是在同一时刻,大量缓存Key集中失效或者Redis服务本身不可用,导致所有请求直接穿透到数据库,造成数据库压力过大甚至宕机的现象。

解决方案:1.最常用的预防方案是给Key的过期时间设置一个随机值,让Key在不同时间点过期,避免集体失效。这也是我们项目中采用的方法。

2.对于Redis服务宕机的情况,需要通过搭建高可用的Redis集群(如哨兵或集群模式)来保证服务的可用性。

应急措施:

1.使用互斥锁,保证只有一个线程去数据库加载数据,防止大量并发

2.引入熔断降级机制,在系统压力大时,对请求进行限流或直接返回降级内容,保护数据库

3.此外,还有一种思路是设置热点数据永不过期,由后台任务定时更新缓存,但这会牺牲一定的数据实时性。

缓存不一致的问题

概念:缓存一致性指的是缓存中的数据与底层数据库中的数据必须保持相同。当数据在数据库中被修改后,缓存应该能够及时得到更新或失效,以保证下一次读取时能获取到最新的数据。

不一致产生的原因:在于,我们拥有数据的两个副本(一个在DB,一个在Cache),而更新这两个副本的操作不是一个原子操作。只要有先后顺序,在并发读写的情况下,就必然会出现数据不一致的时间窗口。

解决方案:

读流程:

1.读缓存,命中则返回。

2.缓存未命中,则读数据库。

3.将数据库中的数据写入缓存,然后返回响应。

写流程:

1.更新数据库

2.删除缓存

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值