文档章节

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

 

© 著作权归作者所有

共有 人打赏支持
老汉-憨憨
粉丝 19
博文 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-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自己的事件模型-ae

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

C_Z
2013/09/13
0
11
学习笔记-Redis设计与实现-事件

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

技术小阿哥
2017/11/27
0
0
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

没有更多内容

加载失败,请刷新页面

加载更多

border实现等高布局

效果图 实现上图效果的全部html+css代码 <div class="box"> <nav> <h3 class="nav">导航1</h3> <h3 class="nav">导航2</h3> </nav> <section> <div cla......

呵呵闯
5分钟前
0
0
MaxCompute 表(Table)设计规范

表的限制项 表(Table)设计规范 表设计主要目标 表设计的影响 表设计步骤 表数据存储规范 按数据分层规范数据生命周期 按数据的变更和历史规范数据的保存 数据导入通道与表设计 分区设计与逻辑...

阿里云云栖社区
12分钟前
0
0
局域网共享文件读写的实现方式

首先是设置共享目录,支持用户和密码等权限控制 然后我们可以使用Windows资源管理器操作共享目录下的文件 这中间隐藏了资源管理器帮我们建立目录映射和连接的过程,如果设置了用户名和密码,...

夏至如沫
21分钟前
2
0
Elasticsearch安装与配置

一、Docker安装ES 开发模式 可以使用以下命令快速启动Elasticsearch以进行开发或测试: $ docker run -p 9200:9200 -p 9300:9300 -d --name es -e "discovery.type=single-node" docker.ela...

吴伟祥
27分钟前
1
0
移动页面滚动穿透解决方案(荐)

移动页面滚动穿透解决方法目前有多种解决方案,我介绍下几种方案: 解决方案1:阻止冒泡。 //关键代码$(".sliders,.modals").on("touchmove",function(event){    event.preventDefau...

壹峰
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部