导图社区 redis
Redis底层数据结构有:string、hash、list、应用场景、set、sorted set,Redis集群有:主从复制、哨兵模式、集群,欢迎查看。
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
Redis
Redis底层数据结构
string
SDS(简单动态字符串)抽象类型
SDS还被用在缓冲区
优点
获取字符串长度的时间复杂度为o(1)
不会出现字符串变更造成的内存溢出问题
空间预分配,惰性空间释放free字段,会默认留够一定的空间防止重分配内存
应用场景
缓存结构体用户数据,计数
hash
zipmap
压缩的map格式,查询复杂度是O(n),只能当做轻量级的map
dict
数组+链表的基础上进行了一些rehash的优化
Redis的hash采用链地址法处理冲突,但没有使用红黑树优化
哈希表节点采用单链表结构
rehash优化,采用分治思想,将庞大的迁移工作划分到每次CURD中,避免了服务器繁忙
保存结构体信息,可部分获取,不用序列化所有字段
list
ziplist(压缩列表)
内部采用数据压缩的方式存储
方便追加和删除尾部数据、方便计算长度
插入和删除数据会频繁地引起数据移动
quicklist(快速列表)
宏观上是双向链表结构,微观上每个quicklist的节点都是一个ziplist
插入和删除数据的效率很高,而查询的效率又可以通过ziplist弥补
quicklist是list数据结构的首选
微博的关注列表、粉丝列表
set
一个value为null的HashMap
intset
使用整数集合作为底层实现
hashtable
使用字典作为底层实现,字典的每个键是集合的元素,字典的值为null
去重的场景,取交集、并集、差集,实现共同关注、共同喜好、二度好友等功能
sorted set
从小到大排序的set
map和skiplist(跳跃表)
保证数据的存储和有序,map中存放成员到score的映射,skiplist存放所有成员,使用skiplist可以获得较高的查找效率
Redis集群
主从复制
一主多从
master
写数据,执行写操作时将出现变化的数据自动同步到slave
slave
读数据
作用
读写分离:提高负载能力
负载均衡
slave分担master负载,并根据需求的变化,改变slave的数量,通过多个节点分担数据读取负载,大大提高Redis服务器并发量和数据吞吐量
故障恢复
数据冗余
实现数据热备份,持久化之外的数据冗余方式
工作流程
建立连接阶段(准备阶段)
设置master的地址和端口,保存master信息
建立socket连接
发送ping命令(定时器任务)
身份认证
发送slave端口信息
主从连接成功
数据同步阶段
请求同步数据
创建RDB同步数据
恢复RDB同步数据
全量复制,master创建命令缓冲区
请求部分同步数据
恢复部分同步数据
复制缓冲区信息,AOF部分复制,执行bgrewriteaof
数据同步工作完成
命令传播阶段
当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态,同步的操作称为命令传播
master将接收到的数据变更命令发送给slave,slave接受命令后执行命令
该过程也是部分复制
三个核心要素
服务器的运行id
主服务器的复制积压缓冲区
主从服务器的复制偏移量
心跳机制
发送ping指令判断slave是否在线
汇报自己的复制偏移量,获取最新的数据变更指令
判断master是否在线
常见问题
频繁的全量复制
网络中断问题
数据不一致
哨兵模式
介绍
分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master
监控
不断检查master和slave是否正常运行,存活检测和运行情况检测
通知
当被监控的服务器出现问题时,向其他哨兵和客户端发送通知
自动故障转移
端来master和slave之间的连接,选取一个slave作为新master,将其他master连接到新的master,并告知客户端新的服务器地址
监控阶段
获取各个哨兵的状态
是否在线,哨兵之间是发布/订阅
获取master的状态
runid
role: master
获取所有slave的状态
role: slave
master_host master_port
offset
通知阶段
维护长期的信息对等
故障转移阶段
发现问题
主观下线
一个哨兵认为master下线了
客观下线
数个哨兵发现master下线,发起投票选择出新master,通过发布订阅模式让所有哨兵知道,将旧master从监控清单里清除
竞选负责人
优选新master
新master上任,其他slave切换master,原master作为slave故障回复后连接
集群
使用网络将若干个计算机联通起来,并提供统一的管理方式,使其对外呈现单机的服务效果
分散单台服务器的访问压力,实现负载均衡
分散单台服务的存储压力,实现可扩展
降低单台服务器宕机带来的业务灾难
集群结构设计
数据存储设计
通过算法设计,计算出key应该保存的位置
将所有的存储空间计划切割成16384份,每台主机保存一部分,每份代表的是一个存储空间,不是一个key的保存空间
将key按照计算出的结果放到对应的存储空间
CRC16(key)%16384
内部通讯设计
各个数据库相互通信,保存各个库中槽的编号数据
一次命中,直接返回
一次未命中,告知具体位置
主从复制和主从切换
从下线
对集群基本不产生影响
主下线
超时间(1s连一次)连不上,开始选主