redis 链表

前言

  1. 借鉴了 黄健宏 <<Redis 设计与实现>> 一书, redis 源码进行学习
  2. 欢迎大家给予意见, 互相沟通学习

概述

redis 的链表结构是双向链表

redis 的链表结构是无环的, head 节点的 prev 与 tail 节点的 next 指向的均为 NULL

多态: 链表节点的值 value 类型是 void *, 也就是可以存储任意类型的值

list 结构定义

定义位置 (src/adlist.h)

list 结构

  1. //双端链表结构
  2. typedef struct list {
  3. // 表头节点
  4. listNode *head;
  5. // 表尾节点
  6. listNode *tail;
  7. // 节点值复制函数
  8. void *(*dup)(void *ptr);
  9. // 节点值释放函数
  10. void (*free)(void *ptr);
  11. // 节点值对比函数
  12. int (*match)(void *ptr, void *key);
  13. // 链表所包含的节点数量
  14. unsigned long len;
  15. } list;

listNode 结构

  1. // 双端链表节点
  2. typedef struct listNode {
  3. // 前置节点
  4. struct listNode *prev;
  5. // 后置节点
  6. struct listNode *next;
  7. // 节点的值
  8. void *value;
  9. } listNode;

listIter 结构

  1. // 双端链表迭代器
  2. typedef struct listIter {
  3. // 当前迭代到的节点
  4. listNode *next;
  5. // 迭代的方向
  6. int direction;
  7. } listIter;

list api (src/adlist.c)

函数 作用 备注
listCreate 创建新链表 list *listCreate(void)
listRelease 释放链表 void listRelease(list *list)
listAddNodeHead 创建节点, 并添加到链表头部 list *listAddNodeHead(list *list, void *value)
listAddNodeTail 创建节点, 并添加到链表尾部 list *listAddNodeTail(list *list, void *value)
listInsertNode 创建节点, 并将其插入到指定节点前面或后面 list *listInsertNode(list *list, listNode *old_node, void *value, int after) {
listDelNode 删除节点 void listDelNode(list *list, listNode *node)
listGetIterator 获取链表迭代器 listIter *listGetIterator(list *list, int direction)
listReleaseIterator 释放链表迭代器 void listReleaseIterator(listIter *iter)
listRewind 重置迭代器指针, 从头开始 void listRewind(list *list, listIter *li)
listRewindTail 重置迭代器指针, 从尾开始 void listRewindTail(list *list, listIter *li)
listNext 获取迭代器当前所指向的节点 listNode *listNext(listIter *iter)
listDup 复制链表, 返回副本 list *listDup(list *orig)
listSearchKey 链表中查询值与 key 匹配的节点 listNode *listSearchKey(list *list, void *key)
listIndex 获取指定索引的节点 listNode *listIndex(list *list, long index)
listRotate 将表尾节点取出移动到表头 void listRotate(list *list)

redis 链表的更多相关文章

  1. PHP+Redis链表解决高并发下商品超卖问题

    目录 实现原理 实现步骤 上一篇文章聊了一下使用Redis事务来解决高并发商品超卖问题,今天我们来聊一下使用Redis链表来解决高并发商品超卖问题. 实现原理 使用redis链表来做,因为pop操作是 ...

  2. Redis链表实现

    链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...

  3. Redis 链表结构 和 常用命令

    Redis 数据结构 --链表(linked-list) 命令 说明 备注 lpush key node1 [node2 ...] 把节点 node1 加入到 链表最左边 如果是 node1.node ...

  4. 双链表【参照redis链表结构】

    参照了Redis里面的双链表结构,可以说是完全复制粘贴,redis的双链表还是写的很通俗易懂的,没有什么花里胡哨的东西,但是redis还有个iter迭代器的结构来遍历链表.我这里就没有实现了,只是实现 ...

  5. Redis链表相关操作命令

    lists链表类型lists类型就是一个双向链表,通过push,pop操作.从链表的头部或者尾部添加删除元素,这样list即可以作为栈也可以作为队列 lpush key value 在链表key的头部 ...

  6. Redis学习之底层链表源码分析

    Redis底层链表的源码分析: 一.链表结点的结构(单个结点): // listNode 双端链表节点 typedef struct listNode { // 前置节点 struct listNod ...

  7. 图解Redis之数据结构篇——链表

    前言     Redis链表为双向无环链表!     图解Redis之数据结构篇--简单动态字符串SDS提到Redis使用了简单动态字符串,链表,字典(散列表),跳跃表,整数集合,压缩列表这些数据结构 ...

  8. Redis设计与实现 (二): 链表

    Redis实现为双链表结构, 列表键的底层实现之一就是链表,  发布与订阅, 慢查询, 监视器等功能都用到了链表. Redis本身也使用链表维持多个客户端. 节点定义, 位于 adlist.h/lis ...

  9. Redis学习笔记(二) 链表

    链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度. redis中链表应用广泛,如list中就使用了链表. 每一个链表节点使用listNode结构标识( ...

随机推荐

  1. HTML&CSS Table元素详细解说

    1.预热 css样式多如牛毛,我不可能一个一个去讲,那样好像背字典一样,我相信你们也不喜欢这样的方式.所以,我会在实战中慢慢和你讲解,然后,你记住一些重要的css属性就可以了.关键是,你要学会去查资料 ...

  2. .NET 三层架构

    三层架构简介: 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer).业务逻辑层(Business Lo ...

  3. 转换器3:手写PHP转Python编译器,词法部分

    上周写了<ThinkPhp模板转Flask.Django模板> 一时技痒,自然而然地想搞个大家伙,把整个PHP程序转成Python.不比模板,可以用正则匹配偷懒,这次非写一个Php编译器不 ...

  4. wemall doraemon中Android app商城系统向指定URL发送GET方法的请求代码

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...

  5. win10如何合并硬盘分区

    好多人都会讲电脑硬盘分成几个不同的区,以方便自己的资料的存储和查找,但不少人不知道如何合并已经分出的硬盘分区.以下是我的经验,与大家分享: 1.   首先,右击“此电脑”,在弹出来的右键菜单这种选择“ ...

  6. 1664: [Usaco2006 Open]County Fair Events 参加节日庆祝

    1664: [Usaco2006 Open]County Fair Events 参加节日庆祝 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 255  S ...

  7. windows phone 8.1开发:socket通信聊天

    本例用WPF程序做服务器端,windows phone程序做客户端.我们使用基于UDP协议的Socket通信.更多关于socket信息请查看:http://msdn.microsoft.com/zh- ...

  8. iOS开发之类扩展

    在以往写代码时,我们经常是把声明写在.h文件中,把实现写在.m文件中,但是在实际开发中,如果把声明写在.h文件中会暴露程序很多属性(成员变量.成员变量的get和set方法),为了安全考虑,引入了类扩展 ...

  9. 1、初识Activity

    Activity是Android的基本组成部分,是人机交互程序入口:一个Android项目由多个Activity组成,所有的显示组件必须放在Activity上才能进行显示. (1)Android项目工 ...

  10. vue-router2.0动态路由获取参数

    一下demo演示2.0中的vue-router是如何获取到不同参数的,并在地址栏中匹配不同的信息 <!DOCTYPE html> <html lang="en"& ...