Redis缓存问题

Redis就是用支持缓存的,它有什么缓存问题?

1、一致性问题

分布式系统的数据一般都是弱一致性,或最终一致性。因为有CAP原则,在一致性(Consistency)、可用性(Availbility)和分区容错性(Partition Tolerance,分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务)中只能三者取其二,由于分布式系统一定有分区容错性,所以只有一致性、可用性可选。二益取其重,所以只能牺牲一致性。

应对Redis缓存的一致性问题的办法是,采取合适的策略来降低缓存和数据库间数据不一致的概率,包括合适的缓存更新策略,更新数据库后及时更新缓存、缓存失败时增加重试机制。但无法保证两者间的强一致性。如果项目对缓存的要求是强一致性的,那么就不要使用缓存。

2、Redis 雪崩

如果所有的KEY都一起失效,那么所有的请求都会瞬时落在数据库上,数据库必然扛不住。唯一方法是重启数据库,然而重启之后,所有请求仍然会一起落在数据库上,再次将数据库打死。

策略是不同的KEY设置不同的过期时间;或者将不同的key分散于不同的服务器。

3、Redis缓存穿透

请求数据库中根本不存在的数据。数据库中不存在,那么redis中肯定也没有,然而外界或黑客却接连不断地请求,不断攻击导致数据库压力很大,严重会击垮数据库。

应对策略:
1)接口层增加校验,比如用户鉴权,参数做校验,不合法的校验直接 return,比如 id 做基础校验,id<=0 直接拦截。
2)应用布隆过滤器(Bloom Filter),如果数据库中不存在的数据直接返回

4、Redis缓存击穿

指一个 Key 非常热点,在不停地扛着大量的请求,大并发集中对这一个点进行访问,当这个 Key 在失效的瞬间,持续的大并发直接落到了数据库上,就在这个 Key 的点上击穿了缓存。缓存穿透跟雪崩效果差不多,但原因不同。雪崩是缓存大面积失效,而缓存穿透是持续请求一个数据。

策略:设置热点数据永不过期,或者加上互斥锁。

参考文章:
人类史上最全Redis技术合集,不看悔终生系列

发布了1134 篇原创文章 · 获赞 354 · 访问量 349万+

猜你喜欢

转载自blog.csdn.net/leftfist/article/details/105185305