Redis study
这篇blog摘抄自《Redis开发与运维》,供自己学习使用。
Redis: Remote Dictionary Server
将数据分为热数据和冷数据,比如视频信息是热数据,放在redis中可以加快读写。
5种数据结构:
字符串 string
- Bitmap 位图
- HyperLogLog
哈希 hash
列表 list
集合 set
有序集合 zset
- 实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码.
1 | 127.0.0.1:6379> OBJECT encoding java |


持久化
RDB
AOF
字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。如图2-7所示,字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。


复制原理
内存

避免使用过长的key
建议主节点挂载的从节点不超过两个
正常的碎片率(mem_fragmentation)在1.03左右,解决方案
- 数据对齐
- 安全重启
动态调整内存上限,最简单最理想化的例子:

建议所有进程都要配置maxmemory.
哨兵 Sentinel

提高整个系统的可用性
分布式架构
Sentinel 原理
- 三个定时任务
- 主观下线
- 客观下线
- 领导者选举
- 故障转移
Redis 分布式方案
客户端分区方案,把数据分到多个节点上。
- 哈希分区
- 顺序分区(Redis采用这种规则)
代理方案
虚拟槽分区 SLOT
Slot :使用分散度良好的哈希函数把所有数据映射到一个固定范围的整数集合中,整数定义为槽,是数据迁移的基本单位。
节点通信
- ping: 检测在线 交换状态信息(自身节点和部分其他节点的状态数据)
- pong: 回应ping meet,(自身节点和部分其他节点的状态数据)
- meet: 通知新节点加入
- fail:判定集群内另一节点的下线时,通知别人

集群伸缩=槽和数据在节点间移动

建议使用redis-trib.rb add node这样的工具进行自动加入新节点,如果手动加入的话,万一旧节点里有数据可能会导致错乱。