Redis学习记录----缓存穿透、雪崩、击穿

117 阅读1分钟

缓存穿透、雪崩、击穿

缓存穿透

缓存穿透就是用户一直用根本不存在的数据去查询数据库,导致数据库崩溃

image.png

image.png

image.png

image.png

具体实现

后面为了区分缓存穿透、击穿的代码,分别提取成单独的方法

image.png

image.png

缓存雪崩

解决缓存雪崩:避免大量key同时失效、使用多个redis等

image.png

缓存击穿

缓存击穿就是针对某个key高并发时失效导致多次查询数据库重建缓存,数据库崩溃

image.png

解决缓存击穿:避免多次重建缓存(有一个线程重建即可)、暂时返回旧数据(一个线程重建缓存,其他线程先接收旧数据)

image.png

image.png

利用互斥锁解决缓存击穿

image.png

image.png

具体实现

image.png

image.png

调用

image.png

利用逻辑过期解决缓存击穿

image.png

具体实现

新增逻辑过期字段,手动添加会修改源码,建议封装一个万能存储数据的类型

image.png

数据预热(重建缓存)

image.png

具体实现

使用线程池开启独立线程,实现缓存重建

image.png

image.png

image.png

image.png

image.png

调用

image.png

封装缓存工具

image.png

image.png

写入redis的两种方法(真实过期与逻辑过期)

image.png

查询redis的两种方法(解决缓存穿透与缓存击穿)

解决缓存穿透(返回空值): 其中由于步骤4原先需要查数据库,但由于使用的是泛型,数据库无法指定查询哪个类型,因此需要调用者在调用时就查询数据库,得到的类型直接在函数中用,因此使用函数式编程Function<ID,R>有参数ID有返回值R

image.png

image.png

image.png

解决缓存击穿(返回过期消息并重建缓存)

image.png

image.png

image.png

image.png

image.png