围着灰机转圈圈

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

我知道点redis-数据结构与对象(链表)

使用

  1. 链表键
  2. 发布与订阅
  3. 慢查询
  4. 监视器
  5. 保存多个客户端的状态信息
  6. 构建客户端输出缓冲区

3.1 链表和链表节点得儿实现

//链表节点
typedef struct listNode {
	
	//前置节点
	struct listNode *prev;
	
	//后置节点
	struct listNode *next;
	
	//节点的值
	void *value;
}listNode;

虽然仅仅使用多个listNode结构就可以组成链表,但使用adlist.h/list来持有链表的话,操作会更方便:

//链表
typedef struct list {

	//表头节点
	listNode *head;
	
	//表尾节点
	listNode *tail;
	
	//链表所包含的节点数量
	unsigned long len;
	
	//节点复制、释放、对比函数
	void *(*dup)(void *ptr);
	void (*free)(void *ptr);
	int (*match)(void *ptr,void *key);
}list;

redis的链表实现的特性可以总结如下:

  • 双端:带有prev和next指针,获取前置节点后置节点的复杂度为O(1);
  • 无环:表头节点的prev指针和表尾节点的next都指向null,对链表的访问以null为终点;
  • 带表头指针和表位指针:程序获取链表的表头节点和表尾节点的复杂度为O(1)
  • 带链表长度计数器:程序获取链表中节点数量的复杂度为O(1);
  • 多态:链表以void*指针来保存节点值,可以通过dupfreematch三个属性为节点值设置类型特定函数;
posted on 2015-08-05 21:02  围着灰机转圈圈  阅读(149)  评论(0编辑  收藏  举报