Redis数据类型
- str
- list
- set
- zset
实现原理: dict+zskiplst dict存贮数据,zskip用于排序和range操作 - hash hash冲突解决方案: 链式寻址法
- stream
redis队列的实现
- list的lpush rpop
- pub sub问题
- stream
存在的问题
- 没有ack机制
- 消息丢失,pubsub不能确保送达, strean存在sizexianzhi
- 不能重复消费
集群以及高可用
- 主从
- 主数据库负责写数据
- 哨兵
- 单哨兵 解决主从模式的选主问题,存在单点故障.
- 多哨兵 通过订阅主数据库
_sentinel_:hello
发现其他哨兵 - 问题
- 中心化方案,只有主节点处理请求
- 全量副本,浪费空间
- cluster模式(3.0之后引入)
- 是一种sharding的技术,采用多主多从的方案(三主三从6节点).节点相互彼此互联
- 采用hash槽来确定key的为主
- 16384个hash槽, crc16 mod 16384 计算key的位置
- 大数量心跳包大
- 支持的节点够用
- 主节点的槽点使用bitmap存贮,槽位少压缩比高
数据持久化
- RDB 快照
定期全量存储
- 使用save 会堵塞服务进程
- dgsave用于主从同步的初始化,会fork一个子线程,不会堵塞
- AOF
记录日志
- 数据完整,秒级丢失
- 存贮空间大
- 采用fsync ,速度慢
一致性hash
- 环形空间
- 数据倾斜问题解决方案,可以吧实体节点映射为虚拟节点
hash冲突的解决办法
- 开放寻址法,在当前的地址链上寻找下一个可用的槽
python的 dict
- 再hash法, 使用不同的hash函数多次进行hash运算
- 拉链法, 使用链表将冲突的key串起来
java HashMap(会进一步使用红黑树) redis hash