总结
- 缓存数据库
- memcache redis
- 多路io复用
- 常用数据类型
- 分布式锁
- 异步队列、
- 海量数据固定前缀第key
- 持久化
- aof
- rdb
- 混合
- redis主从架构
加一个缓存层 在客户和存储
缓存穿透 和 熔断
memcache 代码层次类似hash
- 支持简单数据类型
- 不支持数据持久化
- 不支持分片
- 不支持主从
redis
- 数据类型丰富
- 数据持久化存储
- 主从
- 分片
10w qps
为什么这么快
- 基于内存 执行效率较高
- 数据结构简单 操作简单 kv 数据键值对
- 单线程 高并发 多核可以启动多实例 避免锁和线程切换
- io多路复用 非阻塞io
FD文件描述符
传统io阻塞模型 阻塞模型 多客户端效率差
slect系统调用
监听文件可读可写
多路复用函数epoll kquene evport select
- 因地制宜
- 时间复杂度oO1的函数
- select 作为保底方案
- react设计模式监听io事件
常用数据类型
- string 二进制安全
- hash String 字典 储存对象
- LIst 顺序插入排序
- Set 集
- Sorted Set 分数排序的set
- 计数Hyperloglog
- 支持存储地理位置geo
底层数据类型
- 简单动态字符串
- 链表
- 字典
- 跳表
- 整数集合
- 压缩列表
- 对象
海量key里查询某一个固定前缀的key
- 数据规模 问清楚边界
Keys pattern 查找所有符合给定模式的Key
KEYS一次返回所有key
数量过大,卡吨
SCAN cursor MATCH pattern COUNT count
- 基于游标的迭代器,基于上一次游标延续之前的迭代
- 0代表新的迭代
- 不保证每次返回给出给定数量的元素,支持模糊查询
redis实现分布式锁
- 分布式锁需要解决的问题
- 互斥
- 安全性
- 死锁
- 容错
SETNX key value 如果不存在,创造并且赋值
- O(1)
- 返回值,成功1失败0
setnx 长期有效
expire key seconds key生成时间
expire locknx 2
setnx locknx task
set key value ex seconds px milllseconds nx|xx
大量key过期时间集中 短暂卡顿,过期加一个随机值
redis 异步队列
- rpush lpop消费数据
- 缺点 没有等待队列有值就消费
- 解决 sleep
BLPOP key 没有消息阻塞
pub/sub
主题订阅者模式
- 发送者
- 消费者
消息发布无状态 不保证可达
redis持久化
- RDB 快照 保存时间点全部数据快照
- `SAVE阻塞进程 ,直到所有文件创建
- BGSAVE fork一个子进程来创建RDB文件,不阻塞服务器进程
自动触发持久化RDB
- 根据conf配置定时触发
- 主动复制时候主节点自动触发
- Debug Reload
- Shutdown 且没有开启AOF持久化
BGSAVE 原理
- fork 写时复制
AOF 持久化 保存写状态
- 记录除了查询以外所有变更数据库状态的命令
- append 形式追加保存
AOF持久化
日志重写解决AOF文件大小不断增大的问题
- fork 创建子进程
- 子进程把新的AOF写到临时文件里面,不依赖原来AOF
- 主进程持续把新的变动写到内存混合原来AOF中
- 主进程获取子进程重写AOF完成信号,往新的AOF里面同步增量变动
- 使用新的AOF文件替换旧的AOF文件
redis数据恢复
- 共存恢复
RDB AOF
- RDB内存快照 文件小 恢复快
- 无法保存快照后的数据
- AOF可读性高,保存增量数据,数据不易丢失
- 缺点 体积打,恢复时间长
混合持久化方式
- BGSAVE全量持久化
- AOF增量持久化
pipeline好处
- 类似管道
请求相应模型,每个请求处理需要应答
批量执行指令,节省多次io往返时间
顺序依赖指令分批发送
- redis同步机制
主从同步原理
- slave 发送sync 到master
- master 启动后台进程,redis快照恢复到文件
- master保存数据快照期间收到的写命令缓存起来
- master将完成文件写操作后,将该文件发送给slave
- 使用新的aof文件替换旧的aof文件
- master将这期间收集的增量写命令发送salve端
增量同步过程
- master接收到用户操作指令,判断是否需要传播到slave
- 操作记录追加到aof文件
- 操作传播到其他slave 1,对齐主动库 响应缓存写入指令
- 换粗中的数据发送给slava
redis sentinel
主从切换
- 监控 检查主从服务器是否运行正常
- 提醒:通过api向管理员或者其他应用程序发送故障通知
- 自动故障迁移
流言协议Gossip
- 杂乱五章找到一致
- 节点随机和其他通信。最后所有节点状态一致
- 章哦好嗯子节点随机向其他节点列表需要传播的消息
- 不保证信息一定会传递给所有节点,但是最终会趋向于一致
redis集群
- 海量数据快速找到所需要的
- 分片 按照某种规则去划分数据,分散存储在多个节点上
- 常规哈系无法实现节点动态增减
一致性哈系算法 对2^32取摸 hash模拟成一个圆环
数据key使用同样的hash计算哈系
数据倾斜
加入虚拟节点