高并发场景下缓存处理的一些思路 - 副本
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
革故鼎新、追求卓越、简单靠谱、彼此成就
布隆过滤器 算法原理
革故鼎新、追求卓越、简单靠谱、彼此成就
布隆过滤器实战
Redis 4.0版本 RedisBloom插件
public static void main(String... args){ /** * 创建一个插入对象为一亿,误报率为0.01%的布隆过
5
缓存应用场景
应用 场景
对数据的实时性要求不高 对于经常访问,很少更新的数据(读多写少) 对于性能要求高
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存在高并发场景下常见问题
挑战
缓存数据一致性 缓存穿透 缓存击穿 缓存雪崩
革故鼎新、追求卓越、简单靠谱、彼此成就
本次分享主要应用场景
如何保证数据的一致性?
革故鼎新、追求卓越、简单靠谱、彼此成就
Cache Aside——先操作数据库,后操作缓存
ຫໍສະໝຸດ Baidu• 升级版2
革故鼎新、追求卓越、简单靠谱、彼此成就
题外话
为什么是删除缓存,而不是更新缓存?
革故鼎新、追求卓越、简单靠谱、彼此成就
1、大部分情况,修改缓存成本会高于“增加一次cache miss” 2、并发写的时候,会出现脏数据
革故鼎新、追求卓越、简单靠谱、彼此成就
1 常见缓存更新模式 Cache Aside
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存更新模式之:Cache Aside
失效:应用程序先从 cache 取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。 命中:应用程序从 cache 中取数据,取到后返回。 更新:先把数据存到数据库中,成功后,再让缓存失效。
革故鼎新、追求卓越、简单靠谱、彼此成就
3 常见缓存更新模式 Write Behind Caching
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存更新模式之:Write Behind Caching
Read Through 读 缓存代理 异步 Write Through 写 缓存代理 异步
数据不是强一致性的,而且可能会丢失
革故鼎新、追求卓越、简单靠谱、彼此成就
Cache Aside——先操作数据库,后操作缓存
• 读写并发
缓存过期时间不能漏
革故鼎新、追求卓越、简单靠谱、彼此成就
Cache Aside——先操作数据库,后操作缓存
• 升级版1
以mysql为例,可以使用阿里的canal将binlog日志采集发送 到MQ队列里面,然后通过ACK机制确认处理 这条更新消息, 删除缓存,保证数据缓存一致性
2、缓存永不过期
32
缓存雪崩场景
缓存设置同一过期时间,引起的DB洪峰
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存雪崩常见解决方案
(1)加锁队列。--分布式锁 (2) • 先手动触发请求,将缓存都存储起来,以减少后期请求对database的第一次查询的压力。 • 数据过期时间设置尽量分散开来,不要让数据出现同一时间段出现缓存过期的情况.---(过期时间+随机时
缓存 同步 同步
同步
DB 同步
-
-
优点
缺点
实现容易
维护两个数 据存储
访问速度快, 同步实现数
据
数据同步中 间件实现复
杂
访问速度快,
异步实现数 数据可能会
据同步
丢失
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存穿透场景 (DB承受了没有必要的查询流量)
概念:大量的请求在缓存中没有查询到指定的数据,因此需要从数据库中进行查询,造成缓存穿透。 后果:大量的请求短时间内涌入到database中进行查询会增加database的压力,最终导致database无法承载客户单请求的压力,出现宕 机卡死等现象。
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存穿透常见解决方案
一、空值缓存
二、布隆过滤器
革故鼎新、追求卓越、简单靠谱、彼此成就
引申---缓存穿透解决方案 之 布隆过滤器
问:大量数据,判断给定的数据是否在其中?HashMap?
答:本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插 入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。
分享人:xx
革故鼎新、追求卓越、简单靠谱、彼此成就
革故鼎新、追求卓越、简单靠谱、彼此成就
Write Behind Caching—实战
Cache Aside(Q1-Q2)
Write Behind Caching(Q3-Q4)
24
缓存更新模式小结
方案
Cache Aside
Read/Writ e Through
Write Behind Caching
革故鼎新、追求卓越、简单靠谱、彼此成就
2 常见缓存更新模式 Read/Write Through
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存更新模式之:Read/Write Through
Read Through 读 缓存代理 同步 Write Through 写 缓存代理 同步
需要给编写相关的程序插件,增加了开发的难度性。
间戳) • 缓存永不过期 (3)避免缓存出现单点故障的问题,集群部署,保持高可用; 如Redis Cluster等 (4)启用二级缓存如Ehcache本地缓存 (5)限流&降级,避免DB被打死 如Hystrix, RateLimiter等
革故鼎新、追求卓越、简单靠谱、彼此成就
感谢聆听
部门:xxxx
相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确 切的。
应用: 1.网页URL的去重 2.垃圾邮件的判别 3.集合重复元素的判别
4.查询加速(比如基于key-value的存储系统)
革故鼎新、追求卓越、简单靠谱、彼此成就
布隆过滤器 算法原理
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存击穿
热点Key,大量并发读请求引起的小雪崩
1、分布式锁
<!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-
redis</artifactId> </dependency> <!--redis分布式锁--> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.4.3</version> </dependency>
革故鼎新、追求卓越、简单靠谱、彼此成就
有个疑问?
高并发环境下,先操作数据库还是先操作缓存?
革故鼎新、追求卓越、简单靠谱、彼此成就
Cache Aside——先操作缓存,后操作数据库
• 情况一:读写并发
革故鼎新、追求卓越、简单靠谱、彼此成就
Cache Aside——先操作缓存,后操作数据库
• 情况二:双写并发
革故鼎新、追求卓越、简单靠谱、彼此成就
疑问2?
哪里地方可以使用缓存? Anywhere!
4
缓存原理
缓存存储,即数据的冗余。 (1)数据库访问数据,磁盘IO,慢; (2)缓存里访问数据,存操作,快; (3)数据库里的热数据,可在缓存冗余一份; (4)先访问缓存,如果命中,能大大的提升访问速度,降低数据库压力;
革故鼎新、追求卓越、简单靠谱、彼此成就
Cache Aside——先操作数据库,后操作缓存
• 小结
(1)读取缓存中是否有相关数据 (2)如果缓存中有相关数据value,则返回 (3)如果缓存中没有相关数据,则从数据库读取相关数据放入缓存中key->value,再返回 (4)如果有更新数据,则先更新数据,再删除缓存 (5)为了保证第四步删除缓存成功,使用binlog异步删除 (6)如果是主从数据库,binglog取自于从库 (7)如果是一主多从,每个从库都要采集binlog,然后消费端收到最后一台binlog数据才删除缓存
高并发场景下缓存处理的一些思路
部门:xxxx
分享人:xxx
革故鼎新、追求卓越、简单靠谱、彼此成就
听这个分享有什么好处? • 可以学习到缓存更新的几种思路
• 可以学习到一种解决缓存穿透问题的算法
革故鼎新、追求卓越、简单靠谱、彼此成就
疑问1?
为何需要缓存?
目前磁盘IO和网络IO相对于内存IO的成百上千倍的性能劣势。
滤器 */ BloomFilter<CharSequence> bloomFilter =
BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf8")), 100000000, 0.0001);
bloomFilter.put("121"); bloomFilter.put("122"); bloomFilter.put("123"); System.out.println(bloomFilter.mightContain("121")); }
布隆过滤器 算法原理
革故鼎新、追求卓越、简单靠谱、彼此成就
布隆过滤器实战
Redis 4.0版本 RedisBloom插件
public static void main(String... args){ /** * 创建一个插入对象为一亿,误报率为0.01%的布隆过
5
缓存应用场景
应用 场景
对数据的实时性要求不高 对于经常访问,很少更新的数据(读多写少) 对于性能要求高
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存在高并发场景下常见问题
挑战
缓存数据一致性 缓存穿透 缓存击穿 缓存雪崩
革故鼎新、追求卓越、简单靠谱、彼此成就
本次分享主要应用场景
如何保证数据的一致性?
革故鼎新、追求卓越、简单靠谱、彼此成就
Cache Aside——先操作数据库,后操作缓存
ຫໍສະໝຸດ Baidu• 升级版2
革故鼎新、追求卓越、简单靠谱、彼此成就
题外话
为什么是删除缓存,而不是更新缓存?
革故鼎新、追求卓越、简单靠谱、彼此成就
1、大部分情况,修改缓存成本会高于“增加一次cache miss” 2、并发写的时候,会出现脏数据
革故鼎新、追求卓越、简单靠谱、彼此成就
1 常见缓存更新模式 Cache Aside
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存更新模式之:Cache Aside
失效:应用程序先从 cache 取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。 命中:应用程序从 cache 中取数据,取到后返回。 更新:先把数据存到数据库中,成功后,再让缓存失效。
革故鼎新、追求卓越、简单靠谱、彼此成就
3 常见缓存更新模式 Write Behind Caching
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存更新模式之:Write Behind Caching
Read Through 读 缓存代理 异步 Write Through 写 缓存代理 异步
数据不是强一致性的,而且可能会丢失
革故鼎新、追求卓越、简单靠谱、彼此成就
Cache Aside——先操作数据库,后操作缓存
• 读写并发
缓存过期时间不能漏
革故鼎新、追求卓越、简单靠谱、彼此成就
Cache Aside——先操作数据库,后操作缓存
• 升级版1
以mysql为例,可以使用阿里的canal将binlog日志采集发送 到MQ队列里面,然后通过ACK机制确认处理 这条更新消息, 删除缓存,保证数据缓存一致性
2、缓存永不过期
32
缓存雪崩场景
缓存设置同一过期时间,引起的DB洪峰
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存雪崩常见解决方案
(1)加锁队列。--分布式锁 (2) • 先手动触发请求,将缓存都存储起来,以减少后期请求对database的第一次查询的压力。 • 数据过期时间设置尽量分散开来,不要让数据出现同一时间段出现缓存过期的情况.---(过期时间+随机时
缓存 同步 同步
同步
DB 同步
-
-
优点
缺点
实现容易
维护两个数 据存储
访问速度快, 同步实现数
据
数据同步中 间件实现复
杂
访问速度快,
异步实现数 数据可能会
据同步
丢失
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存穿透场景 (DB承受了没有必要的查询流量)
概念:大量的请求在缓存中没有查询到指定的数据,因此需要从数据库中进行查询,造成缓存穿透。 后果:大量的请求短时间内涌入到database中进行查询会增加database的压力,最终导致database无法承载客户单请求的压力,出现宕 机卡死等现象。
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存穿透常见解决方案
一、空值缓存
二、布隆过滤器
革故鼎新、追求卓越、简单靠谱、彼此成就
引申---缓存穿透解决方案 之 布隆过滤器
问:大量数据,判断给定的数据是否在其中?HashMap?
答:本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插 入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。
分享人:xx
革故鼎新、追求卓越、简单靠谱、彼此成就
革故鼎新、追求卓越、简单靠谱、彼此成就
Write Behind Caching—实战
Cache Aside(Q1-Q2)
Write Behind Caching(Q3-Q4)
24
缓存更新模式小结
方案
Cache Aside
Read/Writ e Through
Write Behind Caching
革故鼎新、追求卓越、简单靠谱、彼此成就
2 常见缓存更新模式 Read/Write Through
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存更新模式之:Read/Write Through
Read Through 读 缓存代理 同步 Write Through 写 缓存代理 同步
需要给编写相关的程序插件,增加了开发的难度性。
间戳) • 缓存永不过期 (3)避免缓存出现单点故障的问题,集群部署,保持高可用; 如Redis Cluster等 (4)启用二级缓存如Ehcache本地缓存 (5)限流&降级,避免DB被打死 如Hystrix, RateLimiter等
革故鼎新、追求卓越、简单靠谱、彼此成就
感谢聆听
部门:xxxx
相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确 切的。
应用: 1.网页URL的去重 2.垃圾邮件的判别 3.集合重复元素的判别
4.查询加速(比如基于key-value的存储系统)
革故鼎新、追求卓越、简单靠谱、彼此成就
布隆过滤器 算法原理
革故鼎新、追求卓越、简单靠谱、彼此成就
缓存击穿
热点Key,大量并发读请求引起的小雪崩
1、分布式锁
<!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-
redis</artifactId> </dependency> <!--redis分布式锁--> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.4.3</version> </dependency>
革故鼎新、追求卓越、简单靠谱、彼此成就
有个疑问?
高并发环境下,先操作数据库还是先操作缓存?
革故鼎新、追求卓越、简单靠谱、彼此成就
Cache Aside——先操作缓存,后操作数据库
• 情况一:读写并发
革故鼎新、追求卓越、简单靠谱、彼此成就
Cache Aside——先操作缓存,后操作数据库
• 情况二:双写并发
革故鼎新、追求卓越、简单靠谱、彼此成就
疑问2?
哪里地方可以使用缓存? Anywhere!
4
缓存原理
缓存存储,即数据的冗余。 (1)数据库访问数据,磁盘IO,慢; (2)缓存里访问数据,存操作,快; (3)数据库里的热数据,可在缓存冗余一份; (4)先访问缓存,如果命中,能大大的提升访问速度,降低数据库压力;
革故鼎新、追求卓越、简单靠谱、彼此成就
Cache Aside——先操作数据库,后操作缓存
• 小结
(1)读取缓存中是否有相关数据 (2)如果缓存中有相关数据value,则返回 (3)如果缓存中没有相关数据,则从数据库读取相关数据放入缓存中key->value,再返回 (4)如果有更新数据,则先更新数据,再删除缓存 (5)为了保证第四步删除缓存成功,使用binlog异步删除 (6)如果是主从数据库,binglog取自于从库 (7)如果是一主多从,每个从库都要采集binlog,然后消费端收到最后一台binlog数据才删除缓存
高并发场景下缓存处理的一些思路
部门:xxxx
分享人:xxx
革故鼎新、追求卓越、简单靠谱、彼此成就
听这个分享有什么好处? • 可以学习到缓存更新的几种思路
• 可以学习到一种解决缓存穿透问题的算法
革故鼎新、追求卓越、简单靠谱、彼此成就
疑问1?
为何需要缓存?
目前磁盘IO和网络IO相对于内存IO的成百上千倍的性能劣势。
滤器 */ BloomFilter<CharSequence> bloomFilter =
BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf8")), 100000000, 0.0001);
bloomFilter.put("121"); bloomFilter.put("122"); bloomFilter.put("123"); System.out.println(bloomFilter.mightContain("121")); }