缓存穿透问题
概念:缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决方案:
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.删除缓存
1011

被折叠的 条评论
为什么被折叠?



