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    BloomFilter
bloomFilter= 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:GET和POST的区别
下一篇:UDP协议

发表评论

最新留言

逛到本站,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
从零开始,学会Python爬虫不再难!!! -- (1)开篇:初识爬虫,基础铺垫 丨蓄力计划 2019-04-27
从零开始,学会Python爬虫不再难!!! -- (2)承接:解析网页,抓取标签 丨蓄力计划 2019-04-27
AttributeError: module ‘urllib‘ has no attribute ‘quote‘的解决办法 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