redis 高并发课题 :击穿、穿透、雪崩、分布式锁
前提条件:高并发
一、缓存穿透:
- 概念理解:
-
解决思路:
- 布隆过滤器:性能不错和存储量可控(不大),使用bitmap位图实现,一个字节8个二进制位;不能删除。只能保证一定不存在,不能保证是否真实存在
- 布谷鸟过滤器:指纹+布谷鸟特性-把蛋下到别人的窝里=》本质:争抢位置
二、缓存击穿
- 概念理解:
-
解决思路:
-
分布式锁+多线程维护锁的过期时间(避免死锁&锁过期但还未执行完成)
- 如果数据的一致性要求不是非常高,建议用触发式任务队列去同步数据。其实原理也就是读写分离,也就说,并发请求所在的线程仅仅是触发更新缓存,但不处理缓存的更新。
-
三、缓存雪崩
- 概念理解:可以理解为n个缓存同时被击穿
- 解决思路:
- 随机过期时间(无时间性要求)
- 预加载(可以提前获取到数据的),比如我在key中加入日期,但前提是我们可以提前获取到下一天的数据
- 强依赖击穿方案
四、分布式锁的实现方式
- 参考:http://redis.cn/topics/distlock.html
- java版实现:redision https://github.com/redisson/redisson
- 原理方式:
- setnx + 过期设置 + 客户端ID(value)
- lua表达式 or 事务性支持 (乐观锁cas)