使用hiredis 实现异步设置发布订阅模式

2023-10-27

通过libevent实现订阅的回调事件

发布端代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>

#include <hiredis/hiredis.h>
#include <hiredis/async.h>
#include <hiredis/adapters/libevent.h>

void getCallback(redisAsyncContext *c, void *r, void *privdata) {
    redisReply *reply = r;
    if (reply == NULL) {
        if (c->errstr) {
            printf("errstr: %s\n", c->errstr);
        }
        return;
    }
    printf("%d\n",reply->elements);
    /* Disconnect after receiving the reply to GET */
    redisAsyncDisconnect(c);
}

void connectCallback(const redisAsyncContext *c, int status) {
    if (status != REDIS_OK) {
        printf("Error: %s\n", c->errstr);
        return;
    }
    printf("Connected...\n");
}

void disconnectCallback(const redisAsyncContext *c, int status) {
    if (status != REDIS_OK) {
        printf("Error: %s\n", c->errstr);
        return;
    }
    printf("Disconnected...\n");
}

int main (int argc, char **argv) {
#ifndef _WIN32
    signal(SIGPIPE, SIG_IGN);
#endif

    struct event_base *base = event_base_new();
    redisOptions options = {0};
    REDIS_OPTIONS_SET_TCP(&options, "192.168.100.204", 6379);
    struct timeval tv = {0};
    tv.tv_sec = 1;
    options.connect_timeout = &tv;


    redisAsyncContext *c = redisAsyncConnectWithOptions(&options);
    if (c->err) {
        /* Let *c leak for now... */
        printf("Error: %s\n", c->errstr);
        return 1;
    }

    redisLibeventAttach(c,base);
    redisAsyncSetConnectCallback(c,connectCallback);
    redisAsyncSetDisconnectCallback(c,disconnectCallback);
    char user_password[]="123456";
    redisAsyncCommand(c, NULL, NULL, "AUTH %s", user_password);
    redisAsyncCommand(c, getCallback, NULL,"PUBLISH runoobChat %s","nihao");
    //redisAsyncCommand(c, getCallback, (char*)"end-1", "GET key");
    event_base_dispatch(base);
    return 0;
}

编译命令

gcc pub.c -o pub -lhiredis -levent

订阅端代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>

#include <hiredis/hiredis.h>
#include <hiredis/async.h>
#include <hiredis/adapters/libevent.h>

void getCallback(redisAsyncContext *c, void *r, void *privdata) {
    redisReply *reply = r;
    if (reply == NULL) {
        if (c->errstr) {
            printf("errstr: %s\n", c->errstr);
        }
        return;
    }
    printf("redisReply size:%d\n",reply->elements);        
    printf("redisReply size:%s\n",reply->element[0]->str);        
    printf("redisReply size:%s\n",reply->element[1]->str);        
    printf("redisReply size:%s\n",reply->element[2]->str);        
    //printf("argv[%s]: %s\n", (char*)privdata, reply->str);

    /* Disconnect after receiving the reply to GET */
    //redisAsyncDisconnect(c);
}

void connectCallback(const redisAsyncContext *c, int status) {
    if (status != REDIS_OK) {
        printf("Error: %s\n", c->errstr);
        return;
    }
    printf("Connected...\n");
}

void disconnectCallback(const redisAsyncContext *c, int status) {
    if (status != REDIS_OK) {
        printf("Error: %s\n", c->errstr);
        return;
    }
    printf("Disconnected...\n");
}

int main (int argc, char **argv) {
#ifndef _WIN32
    signal(SIGPIPE, SIG_IGN);
#endif

    struct event_base *base = event_base_new();
    redisOptions options = {0};
    REDIS_OPTIONS_SET_TCP(&options, "192.168.100.204", 6379);
    struct timeval tv = {0};
    tv.tv_sec = 1;
    options.connect_timeout = &tv;


    redisAsyncContext *c = redisAsyncConnectWithOptions(&options);
    if (c->err) {
        /* Let *c leak for now... */
        printf("Error: %s\n", c->errstr);
        return 1;
    }

    redisLibeventAttach(c,base);
    redisAsyncSetConnectCallback(c,connectCallback);
    redisAsyncSetDisconnectCallback(c,disconnectCallback);
    char user_password[]="123456";
    redisAsyncCommand(c, NULL, NULL, "AUTH %s", user_password);
    //redisAsyncCommand(c, NULL, NULL, "SUBSCRIBE runoobChat");

    redisAsyncCommand(c, getCallback, "SUBSCRIBE", "SUBSCRIBE runoobChat");
    event_base_dispatch(base);
    return 0;
}

编译命令:

gcc sub.c -o sub -lhiredis -levent

需要先起订阅端,在起发布端:

输出如下

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用hiredis 实现异步设置发布订阅模式 的相关文章

随机推荐

  • Python+Vue计算机毕业设计火灾与警情统计系统24b58(源码+程序+LW+部署)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 项目运行环境配置 Python3 7 7 Django Mysql5 7 pip list HBuilderX Vscode也行 Vue Pychram社区版 项目技术 Dja
  • 10分钟教你掌握BigQuery语法

    BigQuery 以下简称BQ 的CRUD操作都可以通过SQL指令來完成 Create SQL INSERT statement Read SQL SELETE statement Update SQL UPDATE MERGE 虽然Big
  • stm32驱动超声波模块

    define HCSR04 PORT GPIOB define HCSR04 CLK RCC APB2Periph GPIOB define HCSR04 TRIG GPIO Pin 8 define HCSR04 ECHO GPIO Pi
  • hadoop默认对3个副本的存储策略和执行策略:

    1 首先要先了解下什么是rack 机架 集群 一个集群有多个机架 一个机架有多个机器 一个机器一个datanode或namenode节点 通常一个机架内的机器之间的网络速度会高于跨机架机器之间的网络速度 2 但是要同时保持副本存储策略的容错
  • javascript 创建对象(object)

  • javascript 中键盘快捷键(键盘事件)

    如果想要在javascript中使用快捷键 可以利用 event ctrlKey event shiftKey event altKey 来进行判断 对应的是ctrl shift 与alt 按键 事件属性可返回一个布尔值 true fals
  • Flutter 判断网络可用性

    Flutter 判断网络可用性 依赖包 dependencies connectivity 0 4 2 代码 import package connectivity connectivity dart 2019 4 18 By GX 判断网
  • LeetCode 142.环形链表II

    给定一个链表的头节点 head 返回链表开始入环的第一个节点 如果链表无环 则返回 null 如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 评测系统内部使用整数 pos 来表示链表尾
  • Nodejs+Extjs+Mongodb开发第一天 Nodejs环境搭建

    一 装备 我个人PC环境是Ubuntu14 JDK7 所以下面的步骤及问题也是基于此进行及产生的 二 Nodejs及npm的安装 这个安装的过程在网上有很多教程 这里就不详细讲了 html view plain copy print sud
  • 一篇文章了解Java虚拟机,Java虚拟机内存详解

    虚拟机介绍 Java虚拟机 JVM 一种用于计算机设备的规范 可用不同的方式 软件或硬件 加以实现 编译虚拟机的指令集与编译微处理器的指令集非常类似 Java虚拟机包括一套字节码指令集 一组寄存器 一个栈 一个垃圾回收堆和一个存储方法域 J
  • unity面板的旋转次序和万向锁

    每个unity物体在面板上都有一个rotation值 那么这个旋转的数值是怎么得出来的呢 假如一个物体xyz的rotation值都不为零 我们拉动面板上的数值会有这样的发现 拉动y值时物体绕世界坐标的y轴也就是竖直方向做旋转 拉动z轴物体沿
  • php websocket 示例

    php使用websocket示例详解 一 php 中处理 websocket WebSocket 连接是由客户端主动发起的 所以一切要从客户端出发 第一步是要解析拿到客户端发过来的 Sec WebSocket Key 字符串 复制代码代码如
  • 2、centos7修改最大文件数

    1 file max 系统所有进程能够打开的文件数 查看当前值 cat proc sys fs file max 修改值 file max的值要大于nr open 如果不修改nr open 那么file max至少要大于1024 1024
  • springboot启动报错:Unable to start web server; nested exception is org.springframework................

    Spring Boot启动出现错误 错误内容大概的意思是 未能加载嵌入的供web应用加载的空间 是因为缺少ServletWebServerFactory bean 解决方法 添加注释 EnableAutoConfiguration
  • inline-block布局与float布局

    1 解释一下display的几个常用的属性值 inline block inline block inline 行内元素 使元素变成行内元素 拥有行内元素的特性 即可以与其他行内元素共享一行 不会独占一行 不能更改元素的height wid
  • 掌握 Linux 调试技术

    http www ibm com developerworks cn linux sdk l debug index html ibm pcon 在 Linux 上找出并解决程序错误的主要方法 Steve Best sbest us ibm
  • 使用tkinter编写一个非常简单的获取股价程序(数据源tushare)

    使用tkinter编写一个非常简单的获取股价程序 数据源tushare 先看结果 主界面 获取股票信息 为更新信息按钮 查询股票信息 为功能按钮 查询股票信息界面 点击查询后 输入起始终止时间 可以查看对应的价格 并绘制K线图 价格 K线图
  • mysql5.7免安装版本

    安装环境 Win10 64位 软件版本 MySQL 5 7 16 解压版 一 下载 点开下面的链接 链接 下载地址 B站安装视频地址 链接 安装视频地址 选择选择和自己系统位数相对应的版本点击右边的Download 此时会进到另一个页面 同
  • 怎么制作睡袋rust_【手工课堂第二十三期】宝宝睡袋DIY

    作者 宝宝知道 依米Yimi 大家好 又到我的手工课堂咯 我是依米 热爱手工 有时间必手工 这一期给大家带来宝宝睡觉必备神器 仿踢睡袋 宝宝睡觉前 穿着睡袋来个bedtime story 睡前故事 真是极好的 睡袋是很多宝妈会选择的睡眠小物
  • 使用hiredis 实现异步设置发布订阅模式

    通过libevent实现订阅的回调事件 发布端代码如下 include