Redis
1. Redis
1.1 缓存中间件
Memcache:
- 代码层次类似哈希
- 支持简单数据类型
- 不支持持久化存储
- 不支持主从
- 不支持分片
Redis:
- 数据类型丰富
- 支持持久化存储
- 支持主从
- 支持分片
1.2 Redis读取速度快的原因(100000+QPS)
- 完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高
- 数据结构简单,对数据操作简单
- 采用单线程,单线程也能处理高并发请求,想多核也可以启动多实例
- 多路I/O服用模型,非阻塞IO
2. Redis常用数据类型
String:最基本的数据类型 ,二进制安全
Hash:String元素组成的字典,适合用于存储对象
List:列表,按照String元素插入顺序排序
Set:String 类型的无序集合,通过哈希表实现,不允许重复
Sorted Set:通过分数来为集合中的成员进行从小到大的排序
还有用于计数的HyperLogLog,用于支持本地存储地理位置信息的Geo
3. 海量数据查询
摸清数据规模,及问清楚边界
keys pattern:查找所有符合给定模式pattern的key
keys指令一次性返回所有匹配的key
缺点:键的数量过大会使服务器卡顿
SCAN cursor [MATCH pattern][COUNT count]
- 基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程
- 以0做为游标开始一次Cinderella迭代,直到命令返回游标0完成一次遍历
- 不保证每次执行都会返回某个给定数量的元素,支持模糊查询
- 一次返回的数量不可控,只能大概率符合count参数
4. 分布式锁
互斥性
安全性
死锁
容错
SETNX key value:如果key不存在,则创建并赋值
时间复杂度O(1)
返回值:成功1,不成功 0
如何解决SETNX长期有效的问题
EXPIRE key seconds
一定时间会删除key
缺点:原子性没有被支持
SET key [EX seconds][PX milliseconds][NX|XX]
操作完成返回OK 否则返回nil
大量key同时过期造成卡顿
在设置过期值时,给每个key加上随机过期值
5. 异步队列
- 使用List作为队列,RPUSH生产消息,LPOP消费消息
缺点:没有等待队列有值就直接消费
弥补:可以通过在应用层引入Sleep机制去调用LPOP重试
- BLPOP key[key …] timeout:阻塞直到队列有消息或者超时
缺点:只能供应一个消费者消费
- pub/sub:主题订阅者
- 发送者pub发送消息,订阅者sub接收消息
- 订阅者可以订阅任意数量的频道
缺点:消息发布无状态,无法保证可达
6. 持久化
6.1 持久化方法
RDB(快照)持久化:保存莫格时间点的全量数据快照
- save:阻塞redis的服务器进程,直到RDB文件被创建完毕
- BGSAVE:Fork一个子进程来创建RDB文件,不阻塞服务器进程
自动化触发
redis.conf配置里的SAVE m n 定时触发(用的是BGSAVE)
- 主从复制时,主节点自动触发
- 执行Debug Reload
- 执行shutdown并且没有开启AOF持久化
- BGSAVE的原理
缺点:
- 内存数据全量同步,数据量大会由于I/O而严重影响性能
- 可能会因为Redis挂掉而丢失从当前至最后一次快照期间的数据
AOF(Append-Only-File)持久化:保持写状态
- 记录下除了查询以外的所有变更数据库状态的指令
- 以append的形式追加保存到AOF文件中
AOF文件大小不断增大的问题
日志重写:
- 调用fork(),创建一个子进程
- 子进程把新的AOF写到一个临时文件里,不依赖原来的AOF文件
- 新的AOF是把当前内存数据生成命令,不需要读取老的AOF文件
- 主进程持续将新的变动同时写到内存和原来的AOF里
- 主进程获取子进程重写AOF的完成信号,往新AOF同步增量变动
- 使用新的AOF文件替换掉旧的AOF文件
RDB和AOF文件共存情况下恢复流程
先看是否存在AOF,再看RDB
RDB-AOF混合持久化方式:
BGSAVE做镜像全量持久化,AOF做增量持久化
Pipeline
- Pipeline和Linux管道类似
- Redis基于请求/响应模型,单个请求处理需要一一应答
- Pipline批量执行指令,节省多次IO往返的时间
- 有顺序依赖的指令建议分批发送
6.2 Redis的同步机制
6.2.1主从同步原理:
全同步:
- Salve发送sync命令到Master
- Master启动一个后台进程,将Redis中的数据快照保存到文件中
- Master将保存数据期间收到的写命令缓存起来
- Master完成写文件操作后,将该文件发送给Salve
- 使用新的AOF文件替换掉旧的AOF文件
- Master将这期间收集的增量写命令发送给Slave
增量同步:
- Master接收到用户操作指令,判断是否需要传播到Slave
- 将操作记录到AOF中
- 将操作扩散到Slave1. 对齐主从数据库;2. 往响应缓存写入指令
- 将缓存中的数据发送给Slave
6.2.2Redis Sentinal
解决主从同步Master宕机后的主从切换问题:
- 监控:检查主从服务器是否运行正常
- 提醒:通过API向管理员或者其他应用程序发送故障通知
- 自动故障迁移:主从切换