Redis简单讲解缓存穿透、缓存雪崩、缓存击穿
一、解决Redis缓存穿透(Redis和数据库中数据都不存在,请求直接访问数据库)
- 暂时缓存空对象
优点:实现简单、维护方便
缺点:额外的内存消耗、可能造成短期的不一致 - 布隆过滤
优点:内存占用较少,没有多余key
缺点:实现复杂、存在误判可能
二、缓存雪崩(同一时段大量缓存失效、Redis服务崩了,大量请求给到数据库)
- 给不同的key的TTL添加随机值
- 利用Redis集群提高服务的可用性
- 给缓存业务添加降级限流策略
- 给业务添加多级缓存
三、Redis缓存击穿(被高并发访问并且缓存重建业务较复杂的key失效了,会直接访问数据库)
- 互斥锁(优:没有内存消耗、保证一致性。缺:实现简单可能死锁、性能差)
(1)如果没缓存,在查询数据库数据的时候加上锁,只让第一次进来的线程查询数据库,其他则等待第一次线程查询完后,放行 - 逻辑过期(优:线程无需等待,性能好。缺:不保证一致性,内存消耗,实现复杂)
(1)缓存数据不设置超时时间,在缓存数据里加上超时时间,用逻辑去更新数据,并加上互斥锁
(2)查询缓存未命中,去获取互斥锁成功后,开辟一个新的线程进行数据更新,主线程返回旧缓存数据。其他请求进来发现上个请求未执行结束,获取互斥锁失败,直接返回旧数据