Redis链表实现

链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层实现。除了链表键之外, 发布与订阅、慢查询、监视器等功能也用到了链表, Redis 服务器本身还使用链表来保存多个客户端的状态信息, 以及使用链表来构建客户端输出缓冲区(output buffer)。

redis实现链表的数据结构:

//链表节点数据结构
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);  //dup函数指针void (*free)(void *ptr);  //free函数指针int (*match)(void *ptr, void *key);  //match函数指针unsigned long len;  //表的长度
} list;

由上面的数据结构可以知道多个listnode可以组成一个list双向链表,这和数据结构中所学的一样。

list结构中的三个函数指针是用来实现c++中的“多态”,由于listnode中的value指针指向的内容不同,导致对应的dup,free,match也会有所不同,这三个函数的作为分别如下:

  • dup 函数用于复制链表节点所保存的值;
  • free 函数用于释放链表节点所保存的值;
  • match 函数则用于对比链表节点所保存的值和另一个输入值是否相等。

上面实现的双向链表和我们在数据结构中学习的双向链表本质是一致的,但这个链表更加的通用。listnode保存的内容是没有要求的,它只负责执行内容的地址,至于内容是用什么数据结构保存的并不关心,真正需要关系内容数据机构的是dup,free和match函数,这样就很类似于c++中的“多态”。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux optimizer,linux命令1—安装optimizer(示例代码)

ZendChina官方:下面介绍一下关于在linux环境下Zend Optimizer 3.3的安装方法。本篇文章是基于RHEL5架构的linux系统。(1)ZendOptimizer 3.3.3版本的安装。ZendOptimizer 3.3.3下载地址:安装:# wget http://down1.chinaunix.net/distfiles/Zen…

LINQ to SharePoint 试用感受, 欢迎讨论~

目前项目需要比较复杂的查询功能, 如果直接写CAML的话以后维护非常麻烦, 然后暂时用LINQ to SharePoint替代之~ URL: http://linqtosharepoint.codeplex.com/ 最大的优点是我不用写CAML了, 非常容易实现一些简单的查询…

ps4移植android游戏,把PS4游戏《Apex英雄》《只狼》搬到安卓手机上玩,这招够简单!...

近期,索尼抢先其他平台,在PlayStaion官方网站发布新信息,使各大主流射击游戏平均流失率达到57%的大逃杀游戏《Apex英雄》,本赛季会加入两名新角色,一位是刚更新的辛烷,另一位会在本赛季结束前推出。根据此前…

VC系统扫雷游戏外挂源代码程序下载(转帖

VC系统扫雷游戏外挂源代码程序下载(转帖)2008-03-04 10:25经过了多次测试写出了历史上第一个有点意义的MFC程序。效果差强人意。^_^ CODE:// CrackWinmineDlg.cpp : implementation file// #include "stdafx.h"#include "CrackWinmine.h&…

JAVA面向对象程序设计(第二版) 袁绍欣 第四章答案

面向对象(上) 1.名词解释:构造方法、抽象 构造方法一般是用来初始化数据成员的,与类名相同,无返回值。 分为有参和无参数,当一个类中没有定义构造函数时,系统会给该类中加一个默认的空参数的构造…

鸿蒙系统公测版发布,鸿蒙OS2.0系统公测版什么时候发布-适配机型

鸿蒙OS2.0手机开发者Beta版本于今日已正式发布,那么鸿蒙OS2.0系统的公测版本上市时间,适配手机名单有哪些,接下来小编就为大家带来了解答,一起看看吧!一、公测版发布时间12月16日,发布了鸿蒙OS2.0手机开发者…

angular 加入原生html,Angular HTML绑定

收到一只叮咚Angular 2.0.0和Angular 4.0.0 final仅为了安全的内容constructor(private sanitizer:DomSanitizer){}transform(style) {return this.sanitizer.bypassSecurityTrustHtml(style);//return this.sanitizer.bypassSecurityTrustStyle(style);// return this.sanitiz…

通过PowerShell获取Windows系统密码Hash

当你拿到了系统控制权之后如何才能更长的时间内控制已经拿到这台机器呢?作为白帽子,已经在对手防线上撕开一个口子,如果你需要进一步扩大战果,你首先需要做的就是潜伏下来,收集更多的信息便于你判断,便于有…

ant引入html页面,antdesign 中 使用 iconfont symbol方式引入图标不展示

最近在写项目遇到了一个问题,我使用vue框架搭建了一个项目。我创建了一个 index.js文件,内容为:import { Icon } from ant-design-vue;const IconFont Icon.createFromIconfontCN({scriptUrl: //at.alicdn.com/t/font_2296540_wpxzi5ar76.js…

java filter

一、Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功…

visualstudio调试html,Visual Studio Code中调试JavaScript

一、安装Debugger for Chrome扩展插件二、配置运行环境最左侧菜单找到调试(一个虫子样图标),点击下图中红色标注或者直接按F5:然后出现下图所示:选择Chrome,会生成Launch.json文件:{// 使用 IntelliSense 了解相关属性…

动态网页技术(二)

SSH整合的基本步骤1、 Spring向下整合Hibernate(DAO层)1.1使用Spring的IoC容器创建sessionFactory1.2使用Spring的IoC容器创建DAO2、 Spring中间管理业务层2.1使用Spring的IoC容器创建Biz Bean2.2使用Spring的AOP配置业务层事务3、 Spring向上整合Str…

Android之PhotoView使用(原创)

文章大纲 一、什么是PhotoView二、代码实战三、项目源码下载 一、什么是PhotoView 一款 ImageView 展示框架,支持缩放,响应手势,位于图片排行榜的第五位,PhotoView 与上面不同的是图片的展示功能,可以实现类似微信头像…

浏览器打不开html链接,win7系统ie浏览器打不开网站链接怎么办

‍‍有些使用ie浏览器的win7旗舰版用户来,最近发现网站中的链接打不开,严重影响上网体验,遇到这种情况我们该怎么办呢?会出现网站链接无法打开很有可能是ie浏览器出了问题,我们可以通过修复IE组件来解决,下…

好玩的代码(1)

看效果&#xff08;gif工具不太会用&#xff0c;效果不是很好&#xff09; 代码很简单&#xff0c;就是对sleep函数和/b的使用。 代码 1 #include <cstdio>2 #include <windows.h>3 using namespace std;4 5 int main(int argc, char **argv)6 {7 printf("…

Python基础实践-密码管理系统实例

密码管理系统实例 需求分析&#xff1a; 1.主界面&#xff08;选项&#xff1a;密码生成&#xff0c;密码查询&#xff0c;密码修改&#xff0c;密码删除&#xff09;2.密码生成&#xff1a;用户输入密码的描述&#xff0c;输入密码的长度&#xff0c;使用随机数生成一个比较复…

html循环加载多个图片,两行代码实现图片碎片化加载

今天来实现一个图片碎片化加载效果&#xff0c;效果如下&#xff1a;我们分为 3 个步骤来实现&#xff1a;定义 html 结构拆分图片编写动画函数定义 html 结构这里只需要一个 canvas 元素就可以了。id"myCanvas"width"900"height"600"style"…

从今开始,好好学习一下算法!

ACM 进阶之路&#xff08;转&#xff09;2007年12月30日 星期日 18:20一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.ACM主要是考算法的,主要时间是花在思考算法上&#xff0c;不是花在写程序与debug上。 下面给个计划你练练&#xff1a; 第一阶段&#xff1…

Redis(1) 简介以及linux环境下的安装

一、简介 Redis是个啥&#xff1f;它是一个key-value型的数据库&#xff0c;它是一个内存性的数据库&#xff0c;数据大量放在内存中&#xff0c;所以速度非常快&#xff0c;快到可以用来当缓存。当然它也有持久化的功能&#xff0c;可以把数据以文件的形式存在硬盘上&#xff…

谈*静态页*(或网页*静态化*)的时候,请区分一些概念(转)

http://www.cnblogs.com/JeffreyZhao/archive/2009/07/05/talk-about-page-statilization.html “静态页”&#xff0c;在Web应用程序开发中是很常见的概念。只是我发现目前还是有相当部分的朋友&#xff0c;在这方面的存在一定的误区。因此现在独立写一篇文章&#xff0c;也想…