Redis脑图
2024-05-27 20:38:42 1 举报
AI智能生成
为你推荐
查看更多
redis脑图
作者其他创作
大纲/内容
具有原子性,在代码中使用
INCR
删除的是列表、集合、有序集合或哈希表类型的 key,如果集合元素过多,是会阻塞Redis的删除的是字符串类型的 key,但是key对应value比较大,比如有几百M
DEL
循环删除元素
scan
随机取出一个 key,这个命令可能导致Redis死循环阻塞
RANDOMKEY
命令
save命令:使 Redis 处于阻塞状态,直到 RDB 持久化完成
bgsave命令
⼿动触发
save m n
flushall
⾃动触发
全量同步时会⾃动触发bgsave命令,⽣成rdb发送给从节点
主从同步
RDB(Redis DataBase)快照式
异步完成,效率⾮常⾼,⼀旦系统出现宕机现象,那么这⼀秒钟之内修改的数据将会丢 失
每秒同步
同步持久化,每次发⽣的数据变化都会被⽴即记录到磁盘中,最多丢⼀条
每修改同步
由操作系统控制,可能丢失较多数据
不同步
自动重写
手动重写
AOF重写
AOF(Append Only File)
4.0混合持久化
持久化
对⽐:● AOF⽂件⽐RDB更新频率⾼,优先使⽤AOF还原数据。AOF⽐RDB更安全也更⼤● RDB性能⽐AOF好● 如果两个都配了优先加载AOF
先读缓存如果命中,直接返回如果缺失,查 DB 并将结果放入缓存,再返回
查询
新增数据,直接存 DB,修改、删除数据,先更新DB,再删缓存
增、删、改
旁路缓存
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致
2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中
3. 延时双删,步骤是:先删除Redis缓存数据,再更新Mysql,延迟⼏百毫秒再删除Redis缓存数据,
数据一致(MySQL)
惰性删除
定期删除
会有阻塞线程的可能性
过期key的删除
Redis已用内存超过maxmemory限定时
淘汰很久没被访问过的数据,以最近一次访问时间作为参考。
Least Recently Used,LRU
淘汰最近一段时间被访问次数最少的数据,以次数作为参考。
Least Frequently Used,LFU
主动清理策略
key
1. ⾸先利⽤setnx来保证:如果key不存在才能获取到锁,如果key存在,则获取不到锁
2. 然后还要利⽤lua脚本来保证多个redis操作的原⼦性
3. 同时还要考虑到锁过期,所以需要额外的⼀个看⻔狗定时任务来监听锁是否需要续约
4. 同时还要考虑到redis节点挂掉后的情况,所以需要采⽤红锁的⽅式来同时向N/2+1个节点申请锁,都申请到了才证明获取锁成功,这样就算其中某个redis节点挂掉了,锁也不能被其他客户端获取到
给获得锁的线程,开启一个定时守护线程,每隔时检查锁是否存在,延长锁key的生存时间,这就解决了锁过期释放,业务还没执行完的情况。
Redisson框架
集群部署分布式锁Redlock+Redisson
分布式锁
单线程快的原因:
1. 纯内存操作
2. 核⼼是基于⾮阻塞的IO多路复⽤机制
3. 单线程反⽽避免了多线程的频繁上下⽂切换带来的性能问题
Redis单线程为什么这么快
单线程
主从切换导致雪崩
脑裂
1、直接写个缓存刷新页面,上线时手工操作一下;
2、数据量不大,可以在项目启动的时候自动进行加载;
3、定时刷新缓存;
缓存预热
问题
综述
⽤来做最简单的数据,可以缓存某个简单的字符串,也可以缓存某个json格式的字符串,Redis分布式锁的实现就利⽤了这种数据结构,还包括可以实现计数器、Session共享、分布式ID
1.字符串(strings)
Redis的列表通过命令的组合,既可以当做栈,也可以当做队列来使⽤,可以⽤来缓存类似微信公众号、微博等消息流数据
2.字符串列表(lists)
和列表类似,也可以存储多个元素,但是不能重复,集合可以进⾏交集、并集、差集操作,从⽽可以实现类似,我和某⼈共同关注的⼈、朋友圈点赞等功能
3.字符串集合(sets)
集合是⽆序的,有序集合可以设置顺序,可以⽤来实现排⾏榜功能
4.有序字符串集合(sorted sets)
可以⽤来存储⼀些key-value对,更适合⽤来存储对象
5.哈希(hashes)
数据结构
1、在过期时间上增加⼀点随机值2、服务降级:暂停非核心数据查询缓存,返回预定义信息(错误页面,空值等)3、跑定时任务,在缓存失效前刷进新的缓存搭建⼀个⾼可⽤的Redis集群
某一时刻大批量热点数据同时过期
1、事前预防:搭建高可用集群事前预防:
2、多级缓存:缺点是实现复杂度高
3、熔断:通过监控一旦雪崩出现,暂停缓存访问,待实例恢复,返回预定义信息(有损方案
4、限流:通过监控一旦发现数据库访问量超过阈值,限制访问数据库的请求数(有损方案)
redis宕机
缓存雪崩
某⼀个热点key突然失效
这个热点key不设置过期时间(永不过期)加上互斥锁
缓存击穿
很可能被恶意请求利用
⼤量key都在redis中不存在
将此不存在的key 关联 null值放入缓存,缺点是这样的key 没有任何业务作用,白占空间
① 过滤器可以用来判定 key 不存在,发现这些不存在的 key,把它们过滤掉就好
② 需要将所有的key 都预先加载至布隆过滤器
③ 布隆过滤器不能删除,因此查询删除的数据一定会发生穿透
超链接
解决:布隆过滤器
解决
缓存穿透
缓存雪崩与缓存击穿都是数据库中有,但缓存暂时缺失
缓存雪崩与缓存击穿都能自然恢复,但缓存穿透则不能
区别
缓存失效
全量复制
主从第一次同步是全量同步,但如果slave重启后同步,则执行增量同步
部分复制
读操作:主库、从库都可以执行处理;
写操作:先在主库执行,再由主库将写操作同步给从库。
读写分离
主从模式主从复制、读写分离
主观下线:哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态, 如果单哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”
客观下线:在哨兵集群中,基于少数服从多数,多数实例都判定主库已“主观下线”,则认为主库“客观下线”。
监控:哨兵进程会周期性地给所有的主从库发送 PING 命令,检测它们是否仍然在线运行。
选主(选择主库):主库挂了以后,哨兵基于一定规则评分选选举出一个从库实例新的主库 。
通知 :哨兵会将新主库的信息发送给其他从库,让它们和新主库建立连接,并进行数据复制(让从库执行replacaof,与新主库同步)。同时,哨兵会把新主库的信息广播通知给客户端,让它们把请求操作发到新主库上。
发布 / 订阅机制
哨兵集群的通信
哨兵模式
hash分片算法
Cluster模式
集群
事务
Redis
0 条评论
回复 删除
下一页