缓存穿透、雪崩、击穿
缓存穿透
缓存穿透就是用户一直用根本不存在的数据去查询数据库,导致数据库崩溃
具体实现
后面为了区分缓存穿透、击穿的代码,分别提取成单独的方法
缓存雪崩
解决缓存雪崩:避免大量key同时失效、使用多个redis等
缓存击穿
缓存击穿就是针对某个key高并发时失效导致多次查询数据库重建缓存,数据库崩溃
解决缓存击穿:避免多次重建缓存(有一个线程重建即可)、暂时返回旧数据(一个线程重建缓存,其他线程先接收旧数据)
利用互斥锁解决缓存击穿
具体实现
调用
利用逻辑过期解决缓存击穿
具体实现
新增逻辑过期字段,手动添加会修改源码,建议封装一个万能存储数据的类型
数据预热(重建缓存)
具体实现
使用线程池开启独立线程,实现缓存重建
调用
封装缓存工具
写入redis的两种方法(真实过期与逻辑过期)
查询redis的两种方法(解决缓存穿透与缓存击穿)
解决缓存穿透(返回空值): 其中由于步骤4原先需要查数据库,但由于使用的是泛型,数据库无法指定查询哪个类型,因此需要调用者在调用时就查询数据库,得到的类型直接在函数中用,因此使用函数式编程Function<ID,R>有参数ID有返回值R
解决缓存击穿(返回过期消息并重建缓存)