整数集合

当一个集合只包括整数值元素,并且这个集合的元素数量不多时,redis 会使用整数集合作为集合键的底层实现。

比如:SADD numbers 1 3 5 7 9;这个集合键的底层就是整数集合。

一、实现

他可以保存类型为 int16_t、int32_t、int64_t 的整数值,并且保证集合中不会出现重复元素,并且有序

1
2
3
4
5
6
7
8
typedef struct intset {
// 编码方式
uint32_t encoding;
// 集合包含的元素数量
uint32_t length;
// 保存元素的数组
int8_t contents[];
} intset;

查看更多

哈希表

哈希表当数据量不断增加时,他的性能就经常会受到哈希冲突和 rehash 开销的影响。两个问题的核心都来自于哈希表要保存的数据量,超过了当前哈希表能容纳的数据量。

redis 的做法:针对哈希冲突,redis 采用了链式哈希。对于 rehash 开销,redis 实现了渐进式 rehash 设计。

一、哈希表的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct dictht {
dictEntry **table;
unsigned long size; // 哈希表大小
unsigned long sizemask;
unsigned long used;
} dictht;

typedef struct dictEntry {
void *key;
union {
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
struct dictEntry *next;
} dictEntry;

如上是哈希表的实现,

查看更多

对象

redis 根据实现的数据结构创建出五种类型的对象:字符串对象、列表对象、哈希对象、集合对象和有序集合对象。

redis 的对象实现了基于引用计数技术的内存回收机制。既可以自动释放对象所占内存;也可以实现对象共享机制,可以让多个数据库键共享同一个对象来节约内存。

一、对象类型与编码

Redis 中五种类型的对象都是由如下结构表示

1
2
3
4
5
6
7
8
9
typedef struct redisObject {
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
// 指向底层实现数据结构的指针
void *ptr;
// ...
} robj;

查看更多

压缩列表

压缩列表(ziplist)是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么 redis 就会使用压缩列表来做列表键的底层实现。

压缩列表是由一系列特殊编码的连续内存块组成顺序型数据结构。一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值。

s

查看更多

复制

一、旧版复制功能

分为 “同步”(sync)和 “命令传播” 两个操作。

  • 同步,用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态
  • 命令传播操作,用于在主服务器的数据库状态被修改时,导致主从服务器的数据库状态出现不一致。此操作让主从服务器的数据库重新回到一致状态

查看更多

集群

一、概念

redis 集群是分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。

1. 节点

一个 Redis 集群通常用多个节点 node 组成,将各个独立的节点连接起来,构成一个包含多个节点的集群

1
2
3
4
5
# 让当前的节点和 ip+port 指定的节点握手,握手成功后,就会将 ip+port 节点加入集群汇总
cluster meet <ip> <port>

# 查看当前集群的节点信息
cluster nodes

redis 服务器在启动时会根据配置文件 cluster-enabled 选项是否为 yes 决定是否开启服务器的集群模式

查看更多

数据库

redis 服务器将所有数据库都保存在 redisServer 结构的 db 数组中,每个 redisDb 结构代表一个数据库。redis 服务器在初始化时,默认会创建 16 个数据库。

1
2
3
4
5
6
7
8
9
10
struct redisServer {
redisDb *db; // 一个数组,保存着服务器中的所有数据库
int dbnum; // 服务器的数据库数量
...
}

typedef struct redisDb {
dict *dict; // 数据库键空间,保存着数据库中所有的键值对
dict *expires; // 过期字典,保存着键的过期时间
} redisDb;

redisDb 结构中的 dict 字典保存了数据库中所有的键值对。

一、切换数据库

使用 select 2 语句,即可将切换到 2 号数据库。

查看更多

事件

Redis 是一个事件驱动程序,服务器需要处理以下两类事件:

  1. 文件事件:Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。服务器和客户端(或者其他服务器)的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作
  2. 时间事件:Redis 服务器中的一些操作(比如 serverCron 函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象

查看更多