Redis

1. Redis

1.1 缓存中间件

Memcache

  • 代码层次类似哈希
  • 支持简单数据类型
  • 不支持持久化存储
  • 不支持主从
  • 不支持分片

Redis

  • 数据类型丰富
  • 支持持久化存储
  • 支持主从
  • 支持分片

1.2 Redis读取速度快的原因(100000+QPS)

  1. 完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高
  2. 数据结构简单,对数据操作简单
  3. 采用单线程,单线程也能处理高并发请求,想多核也可以启动多实例
  4. 多路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. 异步队列

  1. 使用List作为队列,RPUSH生产消息,LPOP消费消息

缺点:没有等待队列有值就直接消费
弥补:可以通过在应用层引入Sleep机制去调用LPOP重试

  1. BLPOP key[key …] timeout:阻塞直到队列有消息或者超时

缺点:只能供应一个消费者消费

  1. 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的原理

缺点:

  1. 内存数据全量同步,数据量大会由于I/O而严重影响性能
  2. 可能会因为Redis挂掉而丢失从当前至最后一次快照期间的数据

AOF(Append-Only-File)持久化:保持写状态

  • 记录下除了查询以外的所有变更数据库状态的指令
  • 以append的形式追加保存到AOF文件中

AOF文件大小不断增大的问题

日志重写:

  1. 调用fork(),创建一个子进程
  2. 子进程把新的AOF写到一个临时文件里,不依赖原来的AOF文件
  3. 新的AOF是把当前内存数据生成命令,不需要读取老的AOF文件
  4. 主进程持续将新的变动同时写到内存和原来的AOF里
  5. 主进程获取子进程重写AOF的完成信号,往新AOF同步增量变动
  6. 使用新的AOF文件替换掉旧的AOF文件

RDB和AOF文件共存情况下恢复流程

先看是否存在AOF,再看RDB

RDB-AOF混合持久化方式:

BGSAVE做镜像全量持久化,AOF做增量持久化

Pipeline

  • Pipeline和Linux管道类似
  • Redis基于请求/响应模型,单个请求处理需要一一应答
  • Pipline批量执行指令,节省多次IO往返的时间
  • 有顺序依赖的指令建议分批发送

6.2 Redis的同步机制

6.2.1主从同步原理:

全同步

  1. Salve发送sync命令到Master
  2. Master启动一个后台进程,将Redis中的数据快照保存到文件中
  3. Master将保存数据期间收到的写命令缓存起来
  4. Master完成写文件操作后,将该文件发送给Salve
  5. 使用新的AOF文件替换掉旧的AOF文件
  6. Master将这期间收集的增量写命令发送给Slave

增量同步

  1. Master接收到用户操作指令,判断是否需要传播到Slave
  2. 将操作记录到AOF中
  3. 将操作扩散到Slave1. 对齐主从数据库;2. 往响应缓存写入指令
  4. 将缓存中的数据发送给Slave

6.2.2Redis Sentinal

解决主从同步Master宕机后的主从切换问题:

  • 监控:检查主从服务器是否运行正常
  • 提醒:通过API向管理员或者其他应用程序发送故障通知
  • 自动故障迁移:主从切换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值