- 缓存在应用系统以及广泛使用,那么关于缓存使用带来的问题如何解决呢?
- 缓存穿透:当一个查询没有命中缓存,而去查询数据库时就是缓存穿透。当查询一个数据库不存在的数据时,就会频繁的造成缓存穿透,给数据库带来压力和无谓的性能消耗。黑客的攻击就可能利用这一特点,频繁查询不存在的数据,造成数据库崩溃。
- 解决方案:缓存不存在的key,其值设为null.这样再次查询是就直接在缓存层返回null.
- 缺点:如果有大量的不存在数据查询,则会浪费缓存内存,而缓存一般是存储在内存里,造成浪费其成本过高。
- 解决方案:在缓存和系统之间再加一层BloomFilter.BloomFilter负责筛选器查询的key是否在数据库存在,存在则去缓存里查询。BloomFilter 相当于是一个过滤层,过滤掉不存在的key,避免其去浪费时间和性能去查缓存和数据库。
-
BloomFilter相当于是一个不重复集合,存在的都在集合里。不存在的不在集合。
-
缓存击穿:同一时间大量请求同一key,而key不存在缓存里或者缓存过期,从而导致大量的请求到达数据库,使数据库某一时刻性能急剧下降。
-
解决方案:互斥锁。加一个互斥锁,这样可以保证大量请求到来时,第一个请求时查询数据库,后边的直接查缓存。
-
验证该数据是否是热点数据,热点数据单独存放。
-
缓存雪崩: 同一时刻大量缓存失效,缓存机器出问题,就会造成大量查询查询数据库,从而导致数据库性能下降,严重会导致崩溃。
-
解决方案:redis 缓存使用集群,主从加哨兵。设置缓存失效时间错开。
-
使用ehache本地缓存,使用Hystrix 进行限流降级。避免数据库崩溃,控制同一时刻对数据库请求的数据量,达到限流的目的。降级是为了数据库的可用性,对一些请求走限流后可以给出一些默认的返回。
-
热点数据集中失效:即热门的数据同时失效,造成都去查数据库。
-
对热点数据存储利用集群存储,分散请求到不同的缓存机器,错开同一热点数据的失效时间。这样避免缓存同时失效。同一缓存的热点数据的失效时间要错开。
-
数据库层面就是加互斥锁,从而使其后续请求可以直接查缓存。
缓存穿透 缓存雪崩 热点数据集中失效解决方案
最新推荐文章于 2024-10-23 17:29:34 发布