redis缓存穿透,缓存击穿,缓存雪崩以及缓存一致性
发布日期:2021-11-13 02:35:06
浏览次数:8
分类:技术文章
本文共 1672 字,大约阅读时间需要 5 分钟。
一、缓存穿透
查询不存在的数据,请求会直接到数据库。
解决:
(1)缓存空值
(2)布隆过滤器BloomFilter
二、缓存击穿
热点key突然失效,大量请求到达数据库
解决:
分布式锁
三、缓存雪崩
大部分key失效
解决:
设置逻辑过期时间
错开物理过期时间
public class RedisCache { Jedis jedis = new Jedis("redis://localhost:6379/9"); DbService db = new DbService(); //redis初始化,bloomFilter加值 //数据库添加值,缓存添加值,bloomFilter加值 //数据库删,缓存删,重构bloomFilter BloomFilterbloomFilter= BloomFilter.create(Funnels.stringFunnel(),10000, 0.001); public String query(String key) { //缓存穿透 if (!bloomFilter.mightContain(key)) { return "空数据"; } //查询缓存 String value = jedis.get(key); //缓存命中 if (value != null) { return value; } else { //缓存未命中,查询数据库,在更新缓存。 //分布式锁,防止缓存击穿造成数据库大量访问 jedis.set(key, "threadId", "NX", "PX", 10); //查询缓存 value = jedis.get(key); if (value != null) { return value; } String dbValue = db.query(key); if (dbValue != null) { jedis.set(key, dbValue); return dbValue; } //释放锁 String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; Object result = jedis.eval(script, Collections.singletonList(key), Collections.singletonList("threadId")); } return ""; }}
四、缓存一致性
以为更新数据库和更新缓存不是原子操作,所以多线程会出现问题。
1.先更新数据库再更新缓存
如果线程A更新数据库 ->线程B更新数据库->线程B更新缓存->线程A更新缓存
会造成数据不一致,先更新缓存再更新数据库同理。
2.先删除缓存再更新数据库
如果线程A删除缓存->线程B查询发现缓存不存在,查询数据库并更新缓存->线程A更新数据库
会造成数据不一致。
3. 先更新数据库再删除缓存
缓存刚好失效 ->线程B查询发现缓存不存在,查询数据库->线程A更新数据库->线程A删除缓存>线程B删除缓存
这种情况出现概率非常小
转载地址:https://blog.csdn.net/johnllllll/article/details/108391881 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年03月29日 01时24分52秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C++面经总结之《Effective C++》(一)
2021-06-30
C++面经总结之《Effective C++》(二)
2021-06-30
这是什么“虎狼之词”啊!!!程序员的健康问题,看一线老中医怎么说!!!
2021-06-30
打开我的收藏夹 -- Python数据分析杂谈
2019-04-27
上手Pandas,带你玩转数据(1)-- 实例详解pandas数据结构
2019-04-27
上手Pandas,带你玩转数据(2)-- 使用pandas从多种文件中读取数据
2019-04-27
上手Pandas,带你玩转数据(3)-- pandas数据存入文件
2019-04-27
爬虫遇上不让右击、不让F12的网站,该怎么办?
2019-04-27
上手Pandas,带你玩转数据(4)-- 数据清洗
2019-04-27
上手Pandas,带你玩转数据(5)-- 数据转换与数据定位
2019-04-27
上手Pandas,带你玩转数据(6)-- 摆脱对pandas可视化丑图的刻板印象吧
2019-04-27
linux shell — 6.初识 EXT2 文件系统
2019-04-27
Java — String(字符串)
2019-04-27
linux shell — 7.linux 磁盘与文件系统管理
2019-04-27
linux shell — 8.linux 磁盘与文件系统管理(2)
2019-04-27
Java — 事件监听、事件处理 初体验
2019-04-27
linux — Centos 7(第一天) 使用时出现的问题及解决方法
2019-04-27