使用Redis做缓存可能带来的问题
- 缓存雪崩:指缓存大面积的失效,导致大量查询落到了数据库上,使数据库挂掉
- 缓存击穿:缓存中热点Key突然失效,原本走缓存的大量请求直接打向了数据库,就好像在缓存中击穿了一个洞。
- 缓存穿透:用户一直请求缓存和数据库不存在的数据,每次请求缓存不命中,数据库也不命中,就像缓存不存在一样,同时不断地请求也给数据库带来压力。
解决方案:
缓存雪崩:首先尽量保证Redis集群的高可用性,发现机器宕机尽快补上,选择合适的内存淘汰策略 ,使用限流降级机制,避免Mysql崩掉,最后使用Redis的持久化机制保存的数据尽快恢复缓存。
缓存击穿:在被查询的数据上加互斥锁,一条线程拿到锁后其它线程只能等待。
缓存穿透:
- 一般方案:将那些从数据库中没有查询到的Key也放入缓存,并将值置为空,下次再查询时直接返回空, 并将该Key设置合适的过期时间,以免有相关Key数据后造成数据不一致的问题。
- 较好方案:使用布隆过滤器(Bloom Filter),它可以快速判断数据是否存在于某个集合中,如果判断数据不存在,那么它一定不存在直接返回空,如果判断数据存在,会先去缓存中查找,缓存命中 则直接返回,不命中则查数据库。