Redis源码解析<3>:adlist--C语言的std::list

《redis设计与实现》第三章是讲链表的,对于像我这种使用C++的人来说,没看过源码之前只是简单地理解为std::list,看过之后发现还是可以理解为std::list,只是帮我深度复习了一次链表数据结构。

Redis整个代码是基于C语言来写的,在C++、Java中习以为常的vector、list这类寻常的数据结构需要人肉再实现一遍,总觉得写这类代码比较别扭,习惯了衣来伸手直接使用的日子,毕竟都是一些大学教科书上的东西,这次看过之后,通过罗列相关的数据结构特点,却也帮我回忆了各个知识点,略有收获。感觉上adlist有这几个特点:
1. 双向链表
2. C风格的简易迭代器
3. 开放的操作入口

adlist的主要结构体定义如下:

typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

typedef struct listIter {
    listNode *next;
    int direction;
} listIter;

typedef struct list {
    listNode *head;
    listNode *tail;
    void *(*dup)(void *ptr);
    void (*free)(void *ptr);
    int (*match)(void *ptr, void *key);
    unsigned long len;
} list;

首先,先说说双向链表,这部分在功能上和std::list很相似:
在struct list中保存了链表的头尾指针,在listNode中则保存了前后节点的地址,再结合listIter.direction可以非常方便的选择是正向移动或者反向移动,进行定位;同时,采用了离散内存而不是连续内存实现,可以在链表的任何位置插入或者删除节点,性能上非常高。但有一点要注意,adlist中删除、添加都是直接操作节点指针而不是操作迭代器,listIter在整个链表中主要以读为主,这和std::list不同,要格外注意安全性。

其次,说说listIter这个简易迭代器,它保存了当前节点的指针以及方向,主要在以下几个函数中使用,都是以读为主的:

listIter *listGetIterator(list *list, int direction);
listNode *listNext(listIter *iter);
void listReleaseIterator(listIter *iter);
void listRewind(list *list, listIter *li);
void listRewindTail(list *list, listIter *li);

最后,说说开放的操作入口,这一特性主要特显在几个函数指针以及数据类型上,节点的数据类型是void*,意味着需要由外界使用者自己管理这块内存,同时下面这三个函数指针可以在创建链表的时候指定,实现逻辑的自定义以适配不同的节点类型:

void *(*dup)(void *ptr);
void (*free)(void *ptr);
int (*match)(void *ptr, void *key);

总结:adlist结构比较基础,没啥好说的,简单看看即可。

转载于:https://my.oschina.net/dodomouse/blog/1828501

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要配置 Redis 集群模式,需要先创建多个 Redis 实例,然后使用哨兵模式进行监控和管理。下面是配置集群模式的步骤: 1. 首先在多个 Redis 实例上启用集群模式,方法是在 redis.conf 文件中设置 cluster-enabled yes。 2. 然后使用 redis-trib.rb 工具创建 Redis 集群,该工具位于 Redis 源代码的 src 目录下。使用以下命令创建 Redis 集群: ``` $ ./redis-trib.rb create --replicas 1 <ip1>:<port1> <ip2>:<port2> <ip3>:<port3> <ip4>:<port4> <ip5>:<port5> <ip6>:<port6> ``` 其中 --replicas 参数指定每个主节点的从节点数量,<ip1>:<port1> 等参数指定每个 Redis 实例的 IP 地址和端口号。 3. 然后在每个 Redis 实例上启用哨兵模式,方法是在 redis.conf 文件中设置 sentinel monitor <master-name> <ip> <redis-port> <quorum>,其中 <master-name> 是要监控的 Redis 主节点名称,<ip> 和 <redis-port> 分别是该主节点的 IP 地址和端口号,<quorum> 是指在哨兵模式下,需要多少个哨兵节点认为主节点失效时才会启动故障转移。 4. 最后在每个哨兵节点上启动哨兵进程,方法是使用以下命令: ``` $ redis-sentinel /path/to/sentinel.conf ``` 其中 /path/to/sentinel.conf 是哨兵进程的配置文件路径。 完成以上步骤后,Redis 集群就配置成功了,哨兵进程会监控主节点的健康状态,当主节点失效时,哨兵进程会自动启动故障转移,将从节点晋升为主节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值