高性能架构之缓存为王
2022-05-03 17:56:11 2 举报
缓存架构、分类、使用、难点
作者其他创作
大纲/内容
BloomFilter
delay 队列
时间轴
②返回数据
更新DB【id=1,val=a->b】
#引用包<dependency> <groupId>org.redisson</groupId> <artifactId>redisson-all</artifactId> <version>3.16.0</version></dependency> #导入依赖import org.redisson.Redisson;import org.redisson.api.RBloomFilter;import org.redisson.api.RedissonClient;import org.redisson.config.Config; #执行代码Config config = new Config();config.useSingleServer().setAddress(\"redis集群地址\");RedissonClient redissonClient = Redisson.create(config);RBloomFilter<String> bloomFilter =redissonClient.getBloomFilter(\"test\
是
开始
缓存模块
DB
连接到本地代理
查询key2
删除cache【key=1】
否
1
客户端是否会连接数据资源
返回数据
数据资源
反向代理服务器
0
删除缓存
MQ
否:更新
是否成功
写入缓存返回数据
更新DB【id=1,val=b】
先写db后删缓存场景2
根据元素的大小和数组的长度计算哈希函数的个数
是(可能误判)
应用服务器2
先写缓存后写db
应用服务器n
thread-1
是否命中
2
通读缓存
查缓存(null)
延时队列
更新cache【key=1,val=a】
应用服务
①访问缓存
缓存是否存在
先写db后删缓存延时双删
旁路缓存
查询key1
客户端
4
不一致时间窗口
③返回数据
thread-2
应用程序
负载均衡服务器
先删缓存后写db
发送binlog
2.1抓取binlog
CDN服务器
更新cache【key=1,val=b】
误判场景发生将'null'写入缓存
4.1成功则进行一次校验
更新DB【id=1,val=a】
判断DB是否存在数据
缓存管理服务
用户请求
本地缓存
......
②是:读取
返回缓存数据
缓存一致性终极解决方案
是:读取
判断布隆过滤器是否包含
数据库服务器
返回结果
binlog抓取组件databus、canal等
hash2(key1)
1.2第一次同步删除
降低误判措施1.增加二进制数组位数2.增加Hash次数
队列
用户
2.2发送binlog消息
3.3延时第二次删除缓存
⑤查询
存在不一致情况
key3
二进制数组
3.2发送延时删除消息
hash1(key1)
3.3失败重回队列
缓存读取流程
3
访问缓存
4.3脏数据修复第三次删除缓存
互联网
应用服务器1
查询缓存
远程分布缓存服务器
block
⑦返回数据
返回数据不存在
查询DB
缺点:1.无法解决随机参数的问题2.无效请求远大于有效请求,极大的浪费存储3.存在误判率,当判断结果为是,则有概率是正常的数据,导致业务受损,这是无法接受的优点:1.可以自动维护布隆过滤器中的数据2.适用场景:固定的key重复请求
判断缓存是否存在数据
数据访问模块
操作类型
粗略时间
cpu registers L1
1ns
cpu registers L2
3ns
cpu registers L3
15ns
本地内存
80ns
SSD磁盘搜索
0.1ms
网络数据包在同一数据中心来回一次的时间
0.5ms
磁盘(非-SSD)
10ms
按顺序从网络读取1MB数据
按顺序从磁盘(非-SSD)读取1MB数据
30ms
跨大西洋网络数据包一次来回延时
150ms
具体流程:首从缓存中读取数据(步骤①)若命中缓存(步骤②),则直接返回缓存中的数据(步骤③)若未命中缓存(步骤④),则从数据库读取数据(步骤五),并放入缓存中(步骤⑥),返回数据结果(步骤⑦)
将key写入布隆过滤器
重置缓存
更新缓存
应用启动时初始化布隆过滤器
互斥锁
场景二:布隆过滤器存储可用的请求
读取缓存
先写db后删缓存场景1
binlog
hash1(key2)
hash2(key2)
根据原始数目和容错率计算需要数组的长度
4.2数据和缓存一致性校验
④否
hash3(key1)
先写DB后写缓存
缺点1.无法自动添加可用的key,如配置发生变更,需要主动更新布隆过滤器2.因为存在误判的问题,导致需要额外缓存'null',redis不支持存储null,需要sdk兼容优点:1.可以最大程度的利用服务资源2.可以解决随机参数的问题
场景一:布隆过滤器存储不可用的请求
MQ重新消费失败的key
参数校验
1.1更新
特点:1.判断不存在的则一定不存在,判断存在的,大概率存在,有一定的误判率2.布隆过滤器占用的空间主要取决hash函数的个数,跟key本身的大小无关,这使得其在空间的优势非常大。3.hashmap也能实现而且还没有误判率,但是当数据量上去后,布隆过滤器的优势非常明显
初始化
文件存储服务器
⑥更新
3.1消费binlog
更新
代理服务器
缓存处理失败的key
互联网缓存架构
hash3(key2)
0 条评论
回复 删除
下一页