Redis key 惰性删除
Redis执行模型-Redis是单线程的吗?
Redis事件驱动框架
Redis 对象 Stream
Redis Server 启动
Redis整体架构
Redis是典型的 Client-Server
架构,类似于MySQL和RPC框架。
Redis Server类似于RPC框架Server,在客户端使用前需要先启动Redis Server。那么有一个问题,Redis Server启动后会做哪些操作?需要哪些配置,有没有什么坑?
(1) Redis Server启动入口-main函数
源码地址 https://github.com/redis/redis/blob/6.0/src/server.c
//file: src/server.c
// #L5297 5297行
int main(int argc, char **argv) {
// 1. 初始化配置 设置默认值
initServerConfig();
/* We need to init sentinel right now as parsing the configuration file
* in sentinel mode will have the effect of populating the sentinel
* data structures with master nodes to monitor. */
// 2. 判断server是否设置为哨兵模式
if (server.sentinel_mode) {
initSentinelConfig();
// 初始化哨兵
initSentinel();
}
/* Check if we need to start in redis-check-rdb/aof mode. We just execute
* the program main. However the program is part of the Redis executable
* so that we can easily execute an RDB check on loading errors. */
// 3. 持久化 rdb aof
if (strstr(argv[0],"redis-check-rdb") != NULL)
redis_check_rdb_main(argc,argv,NULL);
else if (strstr(argv[0],"redis-check-aof") != NULL)
redis_check_aof_main(argc,argv);
// 4. 加载Server配置
loadServerConfig(configfile,options);
// 5. 启动RedisServer时 初始化配置及资源
initServer();
// 6. 循环处理请求及事件,直到服务器关闭为止
aeMain(server.el);
}
Redis 对象 有序集合 / Sorted Set / zset
有序集合(Sorted Set)是Redis中的一种对象,它本身是集合类型,同时也可以支持集合中的元素带有权重,并按权重排序。
(1) 有序集合(Sorted Set)是什么
/*
* ZSET 是有序集合,使用两个数据结构来保存相同的元素,以便将 O(log(N)) INSERT 和 REMOVE 操作放入已排序的数据结构中。
*
* 这些元素被添加到将 Redis 对象映射到分数的哈希表中。
* 同时,将元素添加到将分数映射到 Redis 对象的跳跃列表(因此对象在此“视图”中按分数排序)。
*
* 请注意,为了节省内存,表示元素的 SDS 字符串在哈希表和跳表中都是相同的。
* 为了更容易地管理共享的 SDS 字符串,我们所做的是仅在 zslFreeNode() 中释放 SDS 字符串。
* 字典没有设置无值方法。
* 所以我们应该总是从字典中删除一个元素,然后再从跳过列表中删除。
*/
(1.1) 有序集合结构
/*
* 有序集合 zset 结构体
*/
typedef struct zset {
dict *dict; // 字典
zskiplist *zsl; // 跳表
} zset;
Sorted Set 同时采用跳表
和哈希表
两个索引结构
利用了跳表高效支持范围查询(如 ZRANGEBYSCORE 操作),以及哈希表高效支持单点查询(如 ZSCORE 操作)的特征
可以在一个数据类型中,同时高效支持范围查询和单点查询,这是单一索引结构比较难达到的效果。
Redis 数据结构 跳表(skiplist)
Redis 数据结构 双向链表(linkedlist)
Redis 数据结构 快速列表(quicklist)
Redis3.2版本使用 quicklist
代替了 ziplist
和 linkedlist
.
(1) 快速列表(quicklist)是什么
快速列表(quicklist)是 (压缩列表)ziplist 的 双向链表。
A generic doubly linked quicklist implementation .
快速列表(quicklist)是把压缩列表(ziplist)和双向链表结合起来。
每个双链表节点中保存一个ziplist,然后每个ziplist中存一批list中的数据(具体ziplist大小可配置),这样既可以避免大量链表指针带来的内存消耗,也可以避免ziplist更新导致的大量性能损耗。