场景:高并发(大量)请求,先访问缓存,后访问数据库
缓存穿透:redis和数据库都没查到
缓存击穿:缓存没查到,数据库查到了
缓存雪崩:雪崩==redis或数据库宕机
思考两个问题:
1、什么样的场景会造成上面三种情况?
2、为了避免高并发访问数据库,常用解决方法是什么呢?
用户查询id为-1的数据
黑客强行破解密码
一般是收到黑客攻击,所以应该监控,及时添加黑名单
方法1、从缓存出发,数据库中不存在,在缓存中创建一个空对象返回给用户(代码维护简单,但是效果不是很好)
此时的空对象要设置过期时间:redisCache.put(Integer.toString(id), null, 60) //过期时间为 60s
方法2、使用缓存自带的布隆过滤器(代码维护比较复杂,效果挺好的)
1、一个冷门key,突然被大量用户访问
2、一个热门key,在缓存中时间刚好过期,大量用户并发访问
单机环境下:直接使用常用的锁即可(如:Lock、Synchronized等)
分布式环境下可以使用分布式锁,如:基于数据库、基于Redis或者zookeepe