文档章节

redis 之 ae 模型测试

老汉-憨憨
 老汉-憨憨
发布于 2017/07/25 12:23
字数 393
阅读 8
收藏 0
点赞 0
评论 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 ⋅ 0

事件库之Redis自己的事件模型-ae

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

C_Z ⋅ 2013/09/13 ⋅ 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

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

学习笔记-Redis设计与实现-事件

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

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

redis-cluster部署及数据迁移

工作原理 节选自redis官方文档:http://www.redis.cn/topics/cluster-tutorial.html Redis集群介绍 Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。Redis集群并不支持处理多个k...

苏黎世1995 ⋅ 01/07 ⋅ 0

开源 Web 开发平台 Meteor 的路线图

Meteor是一个开源的的Web开发框架,可以帮助你在短时间内创建高质量的Web应用程序,无论你是有经验的开发者还是新手。 今年7月份,Meteor获得了来自Andreessen Horowitz和Matrix Partners两家...

oschina ⋅ 2012/11/26 ⋅ 6

Redis网络架构及单线程模型

最近略有闲暇时间,于是对Redis进行了一些学习,学习途径除了官方文档还有Redis源代码,我看的版本是2.8.13,Redis源码总行数不到5W行,不同组件拆分非常细致,阅读起来也很清晰。这篇博客主...

Float_Luuu ⋅ 2016/05/20 ⋅ 0

快速掌握Redis——第五招:pub/sub 发布/订阅

1 简易模型 订阅端: Subscribe 频道名称发布端: publish 频道名称 发布内容(远程主机新建两个ssh连接,分别执行pub和sub任务)格式: publish redisChat messagesubscribe redisChatredisC...

vasks ⋅ 2015/03/27 ⋅ 0

Redis——事件

问题: Redis 是单线程的,怎么实现的多个客户端的连接访问? Redis服务器是一个事件驱动程序,服务器需要处理一下两类事件: * 文件事件(file event): Redis服务器通过套接字与客户端(或者其...

nao ⋅ 2016/05/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

645. Set Mismatch - LeetCode

Question 645. Set Mismatch Solution 思路: 遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果r...

yysue ⋅ 12分钟前 ⋅ 0

Confluence 6 从生产环境中恢复一个测试实例

请参考 Restoring a Test Instance from Production 页面中的内容获得更多完整的说明。 很多 Confluence 的管理员将会使用生产实例运行完整数据和服务的 Confluence 服务器,同时还会设置一个...

honeymose ⋅ 16分钟前 ⋅ 0

Python这么强?红包杀手、消息撤回也可以无视,手机App辅助!

论述 标题也许有点不好理解,其实就是一款利用Python实现的可以监控微信APP内的红包与消息撤回的助手。不得不说,这确实是一款大家钟意的神器。 消息撤回是一件很让人恶心的事,毕竟人都是有...

Python燕大侠 ⋅ 28分钟前 ⋅ 0

压缩打包介绍、gzip压缩工具、bzip2压缩工具、xz压缩工具

压缩打包介绍 压缩的好处不仅能节省磁盘空间而且在传输的时候节省传输时间和网络带宽 windows系统下文件带有 .rar .zip .7z 后缀的就是压缩文件 linux系统下则是 .zip, .gz, .bz2, .xz, ...

黄昏残影 ⋅ 32分钟前 ⋅ 0

观察者模式

1.利用java原生类进行操作 package observer;import java.util.Observable;import java.util.Observer;/** * @author shadow * @Date 2016年8月12日下午7:29:31 * @Fun 观察目标 **/......

Cobbage ⋅ 35分钟前 ⋅ 0

Ubuntu打印服务器配置

参考:https://blog.csdn.net/gsls200808/article/details/50950586 https://blog.csdn.net/jiay2/article/details/80252369 https://wiki.gentoo.org/wiki/HPLIP 由于媳妇儿要大量打印资料,......

大熊猫 ⋅ 41分钟前 ⋅ 0

面试的角度诠释Java工程师(二)

原文出处: locality 续言: 相信每一位简书的作者,都会有我这样的思考:怎么写好一篇文章?或者怎么写好一篇技术类的文章?我就先说说我的感悟吧,写文章其实和写程序是一样的。为什么我会...

颖伙虫 ⋅ 43分钟前 ⋅ 0

github中SSH的Key

https://help.github.com/articles/connecting-to-github-with-ssh/ https://help.github.com/articles/testing-your-ssh-connection/ https://help.github.com/articles/adding-a-new-ssh-k......

whoisliang ⋅ 44分钟前 ⋅ 0

only_full_group_by

我的mysql是在CentOS7.1下面的5.7.17 在 /etc/my.cnf 文件里加上如下: sql_mode='NO_ENGINE_SUBSTITUTION' 然后,重启Mysql服务 systemctl restart mysqld...

SunHacker ⋅ 今天 ⋅ 0

实际项目(SpringBoot项目)中集成Druid

参考网页 https://blog.csdn.net/liuchuanhong1/article/details/55050131 https://blog.csdn.net/CoffeeAndIce/article/details/78707819 https://www.pocketdigi.com/20170530/1577.html 为......

karma123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部