Redis内核实现技术

2021-11-15  本文已影响0人  谭英智

数据结构与对象

简单动态字符串(SDS)

用于保存会变化的字符串和用于缓冲区

例如键值对里面的key/value,AOF缓冲之类

struct sdshdr {
    int len;//字符串长度
    int free;//未使用的字节
    char buf[];
};

SDS与C字符串的区别

链表

用于发布订阅、慢查询、监视、链表键等功能

哈希表

struct dictht{
    dictEntry ** table;
    unsigned long size;
    unsigned long sizemask;
    unsigned long used;
};
struct dictEntry {
    void * key;
    union{
      void* val;
        uint64_tu64;
        int64_ts64;
    }v;
    struct dictEntry* next;
};
redis-hash-table
struct listNode {
    struct listNode* prev;
    struct listNode* next;
    void* value;
};

字典

key/value数据结构

用于哈希键底层实现

struct dict {
    dictType* type;
    void* privdata;
    dictht ht[2]; //hash table
    int trehashidx;//rehash in progress flag
};
redis-dict

使用MurmurHash算法来计算hash值

rehash

根据需要进行缩容和扩容,以2的n次方为单元

过程如下:

redis-rehash-1
redis-rehash-2
redis-rehash-3
redis-rehash-4

rehash的触发场景:

渐进式rehash

通过分批次,从哈希表0慢慢迁移到哈希表1,避免服务器暂停服务

delete、find、update会同时在两个哈希表操作

跳跃表

是一种有序的链表结构

查找算法复杂度平均logN,最坏N

作为有序集合键的底层实现

redis-skip-list

整数集合

struct intset {
    uint32_t encoding;
    uint32_t length;
    int8_t contents[]; //int16/int32/int64
};

通过排序数组,来保持set内整数唯一

压缩列表

是列表键和哈希键的底层实现之一

如果键是小整数和短字符串为主,就会使用压缩列表来存储

用于节省内存

对象

redis-obj

内存回收

使用引用计数来回收内存

数据库

读写操作

数据库读写除了对键空间进行读写操作,还会包含以下操作:

过期处理

键过期的时间保存在redisDb的expires字典中

struct reidstDb {
    dict* expires;
};
redis-expired

过期键删除策略

时间事件

通过一个链表来维持时间超时事件

每次都必须遍历整个链表才知道哪些事件需要触发

持久化与复制

生成RDB文件

载入RDB文件

AOF文件写入

AOF载入

AOF重写

复制

Sentinel

redis-sentinel

Sentinel与服务器的连接

redis-sentinel-connect

获取服务器信息

redis-get-master
redis-get-slave

感知其他sentinel节点

redis-feel-others-sentinel
redis-connect-sentinel

主观下线

redis-sentinel-ping

客观下线

sentinel monitor master 127. 0. 0. 1 6379 2

通过配置指定达到多少个sentinel判定服务器为主观下线,来触发客观下线

上面的命令表达达到2个sentinel判定服务器为主观失效,则此服务器为客观下线

Sentinel master选举

得到半数以上票数的sentinel,将成为master

sentinel master的工作

集群

通过对key进行hash分片,通过分布式集群统一对外提供数据访问。集群提供复制和分片功能,实现高可用与大数据存储量功能

集群加节点

redis-cluster-meet

槽slot

执行命令

客户端向在线的集群的其中一个节点发送命令

节点数据库

slots_to_keys

重新分片

redis-slot-reballance

重分片过程中执行命令

redis-ask

复制与故障转移

状态检测

Redis的不足与改进

上一篇下一篇

猜你喜欢

热点阅读