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 写入磁盘,存储 通信协议
命令文本
差异
- aof文件比rdb更新频率高,优先使用aof还原数据
- aof比rdb更安全,但文件更大
- rdb性能比aof好
- 如果两个都配了优先加载AOF
其他
一致性 HASH 算法 (常用的HASH 分片存储方式)
将存储节点hash后放到一个圆上,然后将数据也hash后放到圆上,顺时针遇到的第一个节点就是数据存储节点
掉点或者增加节点只会影响顺时针后的下一个节点的数据,其他节点没有影响
hash 槽 (REDIS 官方集群分片方式)
redis 集群中,一共 2 ^ 14 (16384)个槽位,每个MASTER节点拥有一个槽位区间(why 2^14?)
存储: key 根据crc-16(16位冗余校验) % 2 ^ 14 的值判断进入哪个槽区,从而知道在哪个节点
