Redis集群 — Sentinel

Redis集群 — Sentinel

主从同步的问题

当主节点宕机后,从节点如何跟上?大致需要经历以下步骤:

  1. 手动将从节点设置为主节点
  2. 通知所有应用立即切换新的主节点地址
  3. 通知其他从节点复制新的主节点地址

这些操作都需要人工干预,并且主节点宕机,主从同步被断开,应用无法感知主节点的变化,这势必会导致数据的丢失甚至造成应用方服务不可用。

那么有没有一种解决方案可以实现当主节点断开后,自从切换主节点并更新应用地址,通知所有从节点,实现真正的高可用呢?Sentinel 就是用来解决这种问题的。

Read More
Redis集群 — 主从复制

Redis集群 — 主从复制

主从复制

一个主节点(master),一个或多个从节点(slave)。

从节点充当主节点的“备份”,专门做持久化,用来缓解主节点服务线上请求的同时还需要进行数据持久化的压力。

从节点可以用来做负载均衡,处理读请求,分担主节点读压力(写请求必须由主节点处理)。

CAP理论

CAP原理是分布式应用存储的理论基石,该理论提出三个特性。在分布式系统实践中,不可能全部满足这三个特性,P 是无法避免的,CA 只能满足一个。

  • C:Consistent 一致性
  • A:Availability 可用性
  • P:Partition tolerance 分区容忍性
Read More
Redis原理 — 小对象压缩

Redis原理 — 小对象压缩

使用 32bit 替换 64bit 编译

如果部署 Redis 机器的内存不超过 4G,可以使用 32bit 进行编译,内存所有数据结构的指针空间大小会减少一半,可以达到节约内存的目的。

压缩列表 ziplist

在数据量较少的情况下,Redis 内部会采用一种叫做 ziplist 的数据结构,它会使用 紧凑存储 的方式压缩存储。

Read More
Redis原理 — PubSub

Redis原理 — PubSub

从前面的知识点中我们学过:基于 Redis 的 list 结构可以实现异步队列,基于 zset 结构可以实现延时队列。但是这种方式都有一个不足点,就是他们都是单播机制(一对一),多个消费者订阅同一个生产者只有一个消费者能够消费到消息。在有些业务场景下,我们希望生产者发出的消息能够被所有订阅到的消费者消费到,Redis 单独提供了一个模块 PubSub 支持消息多播(一对多)。

Read More
Redis原理 — 事务

Redis原理 — 事务

Redis 是支持事务的,与之相关的指令有 multi、exec、discard,分别代表事务的开始、提交、丢弃。

以下案例中,使用 multi 开启一个事务,使用 exec 结束事务。在 exec 执行之前,所有指令都不会被执行,而是缓存到了服务端的事务队列里,服务器一旦收到 exec 指令,才执行整个事务队列,一次性返回所有响应。

Read More
Redis原理 — 管道

Redis原理 — 管道

不使用管道的情况下,每个读写请求都会单独发送一个网络数据包,管道的本质是将多个写请求合并作为一个网络数据包发送给服务端,服务端合并多个响应通过一个网络数据包返回,这样多个命令的执行就只构成一个网络来回交互。

管道不是 Redis 服务端的技术而是由客户端提供的,用来减少网络交互、提高存取效率。

Read More
Redis原理 — 持久化

Redis原理 — 持久化

edis 的存储机制有两种,快照(RDB)和AOF。快照存储某一个时间节点的全量备份,AOF日志是连续的增量备份。快照是内存数据的二进制序列化形式,存储十分紧凑,AOF日志是记录数据修改的指令文本,AOF在长期运行中会变得十分庞大,所以需要定期对 AOF 日志进行重写,给系统瘦身。

Read More
Redis原理 — 通信协议

Redis原理 — 通信协议

Redis 使用了一种“浪费流量”的文本协议,优势在于实现过程简单,解析性能极好。它将传输的结构数据分为 5 种最小单元类型,单元结束时统一加上换行符号 \r\n

  1. 单行字符串以 "+" 符号开头。

  2. 多行字符串以 "$" 符号开头,后跟字符串长度。

  3. 整数值以 ":" 号开头,后跟整数的字符串形式。

  4. 错误类型以 "-" 符号开头。

  5. 数组以 "*" 符号开头,后跟数组的长度。

Read More
Redis原理 — 线程安全模型

Redis原理 — 线程安全模型

Redis 是单线程的,基于内存的。但是运行依然很快的原因是其数据都在内存中,还有一个原因是它支持“多路复用”的非阻塞IO,使得 redis 单线程支持多个并发客户端连接。

Redis应用 — Scan

Redis应用 — Scan

keys 的问题

由于众所周知的原因,keys 命令不能随便使用,尤其是在 redis 的实例有成千上万个的时候,使用 keys 会全量遍历导致阻塞其他线程造成线上业务卡顿。

Read More