文档章节

redis 之 adlist

老汉-憨憨
 老汉-憨憨
发布于 2017/07/24 20:59
字数 669
阅读 7
收藏 0
点赞 0
评论 0

digraph adlist {

    rankdir=LR;

    node [shape=record, style = filled, fillcolor = "#95BBE3"];

    edge [style = bold];

    list_node_1 [label = "<head>listNode |{<prev> prev| value|<next> next}", ];
    list_node_2 [label = "<head>listNode |{<prev> prev| value|<next> next}"];
    list_node_3 [label = "<head>listNode |{<prev> prev| value|<next> next}"];

    list_node_1:next -> list_node_2:head;
    list_node_2:next -> list_node_3:head;

    list_node_2:prev -> list_node_1:head;
    list_node_3:prev -> list_node_2:head;

    node [width=1.5, style = filled, fillcolor = "#A8E270"];
    list [label = "list |<head> head|<tail> tail|<dup> dup|<free> free|<match> match|<len> len"];

    list:tail -> list_node_3:head;
    list:head -> list_node_1:head;
}

这里主要是测试和学习使用了 adlist 的相关函数, 具体原理后面补充:

1.  拷贝 :

adlist.c  和 adlist.h  到一个单独的文件夹, 自己创建一个 main.c 的文件

# 我的目录文件结构
adlist  adlist.c  adlist.h  main.c

#adlist 是编译后生成的可执行文件
#adlist.c 是 redis 源码里面的 adlist.c 做了少许修改
#adlist.h 是 redis 源码里面的 adlist.h 没有做任何修改
#main.c 为测试代码程序

adlist.c 修改部分如下:

#include <stdlib.h>
#include "adlist.h"
//#include "zmalloc.h"  // 注释调该头文件

// 定义了下面的两个宏
#define zmalloc malloc
#define zfree free

这里不贴 adlist.c 和 adlist.h 文件的内容了, 具体可以从 redis 里面的源码获得。

2. 具体测试源码如下:

#include <stdio.h>
#include <stdlib.h>
#include "adlist.h"

char str[] = "ABCDEFGHIJKLMOPQRSTUVWXYZ";

int main(int argc, char *argv[])
{
    int alphLen = sizeof(str)/sizeof(char);
    list *lst = listCreate();
    if (lst == NULL) {
        printf("listCreate() error!\n");
        return -1;
    }
    
    int i = 0;
    for (i = 0; i < alphLen; i++) {
       lst = listAddNodeHead(lst, &str[i]);
    }

    listIter *item = listGetIterator(lst, AL_START_HEAD);
    listNode *node = NULL;
    while ((node = listNext(item)) != NULL) {
        char *p = listNodeValue(node);
        printf("%c ", (char)(*p));
    }
    printf("\n");

    
    listRewindTail(lst, item);
    while ((node = listNext(item)) != NULL) {
        char *p = listNodeValue(node);
        printf("%c ", (char)(*p));
    }
    printf("\n");
    
    listReleaseIterator(item);
    item = NULL;

    printf("------------------------------------------------\n");
    list *lstdup = listDup(lst);

    listIter *itemdup = listGetIterator(lstdup, AL_START_TAIL);
    listNode *nodedup = NULL;
    while ((nodedup = listNext(itemdup)) != NULL) {
        char *p = listNodeValue(nodedup);
        printf("%c ", (char)(*p));
    }
    printf("\n");
    
    listRewind(lstdup, itemdup);
    while ((nodedup = listNext(itemdup)) != NULL) {
        char *p = listNodeValue(nodedup);
        printf("%c ", (char)(*p));
    }
    printf("\n");
    listReleaseIterator(itemdup); 
    itemdup = NULL;

    printf("------------------------------------------------\n");
    for (i = 0; i < alphLen; i++)  {
        listNode *indexN = listIndex(lst, (long)(i));
        char *p = listNodeValue(indexN);
        printf("%d -> %c\n", i, (char)(*p));
    }

    printf("------------------------------------------------\n");
    listRotate(lst);
    listNode *index0 = listIndex(lst, (long)(0));
    char *p = listNodeValue(index0);
    printf("%d -> %c\n", 0, (char)(*p));

    printf("------------------------------------------------\n");
    listDelNode(lst, index0); 
    listIter it;
    listRewindTail(lst, &it);
    while ((node = listNext(&it)) != NULL) {
        char *p = listNodeValue(node);
        printf("%c ", (char)(*p));
    }
    printf("\n");
    printf("------------------------------------------------\n");
    
    listNode *index3 = listIndex(lst, (long)(3));
    lst = listInsertNode(lst, index3, &str[0], 1);
    listRewind(lst, &it);
    while ((node = listNext(&it)) != NULL) {
        char *p = listNodeValue(node);
        printf("%c ", (char)(*p));
    }
    printf("\n");
    printf("------------------------------------------------\n");
    
    
    listRelease(lst);
    listRelease(lstdup);
    return 0;
}


3. 编译:

gcc main.c adlist.c -o adlist

4. 输出:

./adlist 
 Z Y X W V U T S R Q P O M L K J I H G F E D C B A 
A B C D E F G H I J K L M O P Q R S T U V W X Y Z  
------------------------------------------------
A B C D E F G H I J K L M O P Q R S T U V W X Y Z  
 Z Y X W V U T S R Q P O M L K J I H G F E D C B A 
------------------------------------------------
0 -> 
1 -> Z
2 -> Y
3 -> X
4 -> W
5 -> V
6 -> U
7 -> T
8 -> S
9 -> R
10 -> Q
11 -> P
12 -> O
13 -> M
14 -> L
15 -> K
16 -> J
17 -> I
18 -> H
19 -> G
20 -> F
21 -> E
22 -> D
23 -> C
24 -> B
25 -> A
------------------------------------------------
0 -> A
------------------------------------------------
B C D E F G H I J K L M O P Q R S T U V W X Y Z  
------------------------------------------------
 Z Y X A W V U T S R Q P O M L K J I H G F E D C B 
------------------------------------------------

 

© 著作权归作者所有

共有 人打赏支持
老汉-憨憨
粉丝 18
博文 322
码字总数 68382
作品 0
深圳
程序员
Redis 2.8.9源码 - Redis中的双端链表实现 adlist

本文为作者原创,转载请注明出处:http://my.oschina.net/fuckphp/blog/269801 adlist作为Redis中的双端链表,在Redis中被广泛的应用到了很多地方,比如 slowlog的存储,主从复制中报错客户端...

logbird ⋅ 2014/05/27 ⋅ 0

CentOS 6.5 安装 Redis 执行 make #error "Newer version of jemalloc required"

CentOS 6.5 安装 Redis 执行 make #error "Newer version of jemalloc required" 根据你系统安装时或之后安装的选项的情况,可能在安装的过程中遇到不同的问题; 就像今天遇到的一台机器,安...

锅巴跑跑 ⋅ 2016/11/30 ⋅ 0

Redis源码安装 CentOS7

获取官方最新源码 官方下载 地址:http://redis.io/download 选择一个稳定版本下载,当前稳定版本3.0.6。 下载源码 cd /tmp wget http://download.redis.io/releases/redis-3.0.6.tar.gz 编译...

Corlang ⋅ 2016/01/14 ⋅ 0

初识redis及实现session共享

1.Redis介绍及安装 Redis是当前比较热门的NOSQL系统之一, 它是一个key-value存储系统,和memcached类似,但在很大程度上补足了memcached的不足,它支持存储的value类型相对较多,包括String,Li...

陈小扁 ⋅ 2016/05/03 ⋅ 0

Redis研究-3.1 数据结构之链表

我们知道,数据结构中,链表的最大好处就是能高效的实现动态增、删、改,缺点就是遍历访问比较慢,因此,在Redis中,很多功能的底层实现都是基于链表的,因为Redis是基于C语言来写的,所以只...

会飞的杨先生 ⋅ 2015/08/25 ⋅ 0

Redis源码分析(adlist)

源码版本: 源码位置: adlist.h : 数据结构定义。 adlist.c:函数功能实现。 一、adlist简介 Redis中的链表叫(A generic doubly linked list implementation 一个通用的双端链表实现),和普...

yangbodong22011 ⋅ 2017/11/08 ⋅ 0

redis数据结构之一:链表

链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。redis提供五种数据结构:String、hash、list、set、sorted set。这五大数据类型底层...

mypsf ⋅ 2016/10/24 ⋅ 0

redis3.2安装过程分享

转载自我要求索网 redis3.2安装过程分享 去 redis官网 下载对应的版本。下载地址:https://redis.io/download centos安装redis 下载redis-3.2.5.tar.gz 解压文件并进入解压后的目录 [root@lo...

求索路 ⋅ 2016/12/27 ⋅ 0

编译redis-2.6.14出现"Newer version of jemalloc required"

zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directoryzmalloc.h:55:2: error: #error "Newer version of jemalloc required"make[1]: *** [adlist.o] Error 1make[1]: L......

雷霆Ting ⋅ 2016/08/18 ⋅ 0

linux环境下安装redis,绝对ok

// 直接从网上下载 redis 当然你也可以直接从别的地方拿过来直接放在redis中 [root@iZ2zedckzf8nczp6xshv4mZ /]# wget http://download.redis.io/releases/redis-2.6.14.tar.gz -----------......

Gjanuary ⋅ 2017/07/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

sbt网络问题解决方案

http://dblab.xmu.edu.cn/blog/maven-network-problem/

狐狸老侠 ⋅ 12分钟前 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 56分钟前 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部