文档章节

redis 之 ae 模型测试

老汉-憨憨
 老汉-憨憨
发布于 2017/07/25 12:23
字数 393
阅读 8
收藏 0

主要用来测试和学习 redis 的 ae 模型

总体来说 代码结构简单,容易理解。

1. 从 redis 目录拷贝 ae.c  ae.h ae_epoll.c 到一个单独的目录

代码目录结构如下:

>ls
ae.c  ae_epoll.c  ae.h  aeRun  main.c

# ae.c 来自 redis 的源码
# ae_epoll.c 来自 redis 的源码 (代码未做修改)
# ae.h 来自 redis 的源码 (代码未做修改)
# aeRun 编译后的可执行文件
# main.c 自己编写的测试 代码

ae.c 代码修改如下:

/* 注释调下面的两个头文件, 这里测试无需这两个头文件 */
//#include "zmalloc.h"
//#include "config.h"

/* 添加下面的 4 个宏, 系统是 linux 所以用 epoll 即可 */
#define zmalloc  malloc
#define zfree    free
#define zrealloc realloc

#define HAVE_EPOLL (1)

 

2. main.c 源码

#include "ae.h"

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <poll.h>
#include <string.h>
#include <time.h>
#include <errno.h>

void loop_init(aeEventLoop *lp)
{
    printf("loop init!\n");
}

void file_cb(aeEventLoop *lp, int fd, void *date, int mask)
{
    char buf[1024] = {'\0'};
    int len = read(fd, buf, sizeof(buf) - 1);
    printf("fd = %d, data = %s\n", fd, buf);
}

int time_cb(aeEventLoop *lp, long long id, void *data)
{
    static int num = 0;
    printf("now is %ld\n", time(NULL));
    if (++num == 5) {
        return AE_NOMORE;
    }
    return 5 * 1000;
}

void fin_cb(aeEventLoop *lp, void *data)
{
    printf("fin_cb run!\n");
}

int main(int argc, char *argv[])
{
    aeEventLoop *lp = NULL;

    lp = aeCreateEventLoop(1024);
    aeSetBeforeSleepProc(lp, loop_init);

    int res;
    res = aeCreateFileEvent(lp, STDIN_FILENO, AE_READABLE, file_cb, NULL);
    if (res) {
        printf("aeCreateFileEvent error! res = %d\n", res);
    }

    res = aeCreateTimeEvent(lp, 5*1000, time_cb, NULL, fin_cb);
    if (res) {
        printf("aeCreateTimeEvent error! res = %d\n", res);
    }

    aeMain(lp);

    return 0;
}

编译:

gcc ae.c  main.c -o aeRun

输出:

./aeRun 
loop init!
loop init!
now is 1500956579
loop init!
now is 1500956584
loop init!
now is 1500956589
loop init!
loop init!
now is 1500956594
loop init!
now is 1500956599
loop init!
fin_cb run!
loop init!
1234567890
fd = 0, data = 1234567890

loop init!
^C

 

© 著作权归作者所有

共有 人打赏支持
老汉-憨憨
粉丝 18
博文 322
码字总数 68382
作品 0
深圳
程序员
Redis 2.8.9源码 - ae模块

本文为作者原创,转载请注明出处:http://my.oschina.net/fuckphp/blog/505956 Redis 的 ae模块的代码主要分布在 ae.c ae.h 还有 ae*.c 中,分别实现了epoll、evport、kqueue、select几种网络...

logbird
2015/09/14
93
0
事件库之Redis自己的事件模型-ae

Redis自己的事件模型 ae 1.Redis的事件模型库 大家到网上Google“Redis libevent”就可以搜到Redis为什么没有选择libevent以及libev为其事件模型库,而是自己写了一个事件模型。从代码中可以...

C_Z
2013/09/13
0
11
Redis 专栏(使用介绍、源码分析、常见问题...)

来源http://blog.csdn.net/yangbodong22011/article/details/78529448 https://github.com/hurley25 https://github.com/hurley25/ANet ANet 基于Redis网络模型的简易网络库,网络模块代码取......

libaineu2004
2017/12/16
0
0
redis-cluster集群单机搭建

闲来无事自己做的关于redis-cluster集群的测试 redis的安装 下载安装包(这里使用的版本是:redis-3.2.9.tar.gz) cd /home/download tar -zxvf redis-3.2.9.tar.gz mv redis-3.2.9 redis 创...

独狼的小窝
2017/09/25
0
0
学习笔记-Redis设计与实现-事件

Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽...

技术小阿哥
2017/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
0
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
18
4
centos7安装redis及开机启动

配置编译环境: sudo yum install gcc-c++ 下载源码: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压源码: tar -zxvf redis-3.2.8.tar.gz 进入到解压目录: cd redis-3......

hotsmile
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部