文档章节

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

没有更多内容

加载失败,请刷新页面

加载更多

区块链100讲:盘点那些常用的加密算法原理

在开发过程中,常常用到各种加密方法和算法,本文总结了几种常用加密方法的原理。 1 对称加密 原理:加密和解密数据使用同一个密钥,适合对大量数据进行加解密 安全性:关键是密钥的保存方式...

HiBlock
17分钟前
0
0
zookeeper基本常识

一、Zookeeper基础知识 1 zookeeper是一个类似hdfs的树形文件结构,zookeeper可以用来保证数据在(zk)集群之间的数据的事务性一致。2 zookeeper有watch事件,是一次性触发的,当watch监视的数...

啃不动地大坚果
22分钟前
0
0
Forrester企业级容器平台权威排行出炉,小初创Rancher缘何成为领导者?

全球著名的调研机构Forrester Research近日发布了《The Forrester New Wave: Enterprise Container Platform Software Suites, Q4 2018》报告,对企业级容器平台(ECP)市场进行全面评估,希...

RancherLabs
26分钟前
0
0
【三 异步HTTP编程】 2. 流式HTTP响应

标准响应及Content-Length头 自HTTP1.1以来,服务器为了在一个链接中处理多个HTTP请求及响应,必须随response一起返回合适的Content-Length值。 默认情况下,对于简单请求你无需返回 Conten...

Landas
今天
0
0
Java后端技术栈,到底如何深入学习?

Java,是现阶段中国互联网公司中,覆盖度最广的研发语言。有不少朋友问,如何深入学习Java后端技术栈,今天分享一个,互联网牛人整理出来的Java深入学习路线图,以及免费学习资料。 一 。性能...

别打我会飞
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部