zkcrescent 的木屋

Redis

redis

通信协议

客户端与服务端使用的通信协议, 特点:实现简单,解析快,良好可读性

  • + 表示正确的状态,信息紧跟
  • - 表示错误状态, 信息紧跟
  • * 消息体有多少段
  • $ 下一行长度
  • : 返回值,后面跟

数据结构

  • string(二进制安全,最大512M,原因(没有找到具体说明,纯属个人臆断):可能是因为长度(bit)使用的u32定义,所以最大是2^32,512M)
  • list(链表,最大2^32-1个元素)
  • hash map
  • set(无序集合,hash 实现,数据唯一)
  • zset(有序集合,hash 实现,通过double类型的分数决定排位)

Key 和 Value 长度影响

  • 均只能在512M以内(u32定义)
  • Key 最好不超过1024 字节,原因在于不仅内存资源占用更多,字符搜索和对比需要更多的时间
  • Key 特别短也不建议比如u100flw,建议使用可读性更好的Key, 比如 user:1000:followers

性能

10W+ QPS

随连接数增加而降低

持久化

RDB

redis database, 默认方式,存储数据

AOF

append only file, 根据条件将 aof_buf 中的缓存写入 aof 文件,再根据一定条件 调用 fsync 写入磁盘,存储 通信协议 命令文本

差异

  1. aof文件比rdb更新频率高,优先使用aof还原数据
  2. aof比rdb更安全,但文件更大
  3. rdb性能比aof好
  4. 如果两个都配了优先加载AOF

其他

一致性 HASH 算法 (常用的HASH 分片存储方式)

将存储节点hash后放到一个圆上,然后将数据也hash后放到圆上,顺时针遇到的第一个节点就是数据存储节点

掉点或者增加节点只会影响顺时针后的下一个节点的数据,其他节点没有影响

hash 槽 (REDIS 官方集群分片方式)

redis 集群中,一共 2 ^ 14 (16384)个槽位,每个MASTER节点拥有一个槽位区间(why 2^14?)

存储: key 根据crc-16(16位冗余校验) % 2 ^ 14 的值判断进入哪个槽区,从而知道在哪个节点

SLOT