hiredis Redis 库是否为异步回调创建了自己的线程
Does the hiredis Redis library create its own thread for async callbacks
我在多线程环境中使用Redis,并且对它是如何工作的有疑问。我正在我的 c++ 应用程序中使用 hiredis c 库。
我的问题是:如果我在触发回调时使用异步模式,回调是否会在 Redis 客户端创建的另一个线程中处理?就像创建调用的线程不会受到回调处理的影响吗?谢谢!
Redis 客户端不会创建任何其他 clent 线程,而是在现有线程中工作。
Redis在另一个(主要(进程中工作。您使用的 redis API 在本地进程中工作,并使用进程间通信与主进程。异步请求意味着您的进程或线程将任务放到另一个,之后可以执行任何其他 yout 任务或等待事件。一段时间后,异步回复到达您的应用程序并可供使用。应用程序必须使用 https://en.wikipedia.org/wiki/Event_loop 或任何异步管理系统,通过调用回调来通知您以处理事件(在本例中为 redis 应答(。
异步体系结构意味着运行事件循环,为每个事件调用回调处理程序。调用回调时,可以创建多个异步任务。一旦任务创建,它应该比当任务完成或发生错误时调用回调事件处理程序。回调可能会被分配以启动应用程序或显示新的 Web 连接。调用回调时可以创建 redis 任务,稍后会调用结果事件回调。当前线程中的所有内容。我 нou 有多个线程,合理地期望每个线程都有一个事件循环。
Redis的单线程性质:http://redis.io/topics/latency#single-threaded-nature-of-redis
客户端套接字处于非阻塞状态,因为 Redis 使用多路复用和非阻塞 I/O。 http://redis.io/topics/clients 这意味着您的客户端永远不会被阻止。
从 Redis 2.4 开始,Redis 中的线程仅用于在后台执行一些缓慢的 I/O 操作,主要与磁盘 I/O 有关,但这并不能改变 Redis 使用单个线程为所有请求提供服务的事实。
Hiredis 在调用 redisAsyncHandlerRead(( 时调用回调。因此,回调是在你用来调用 redisAsyncHandlerRead(( 的任何线程上调用
的。我相信在 Linux-ish C 中,一个最小的 Redis 异步示例如下所示(为清楚起见,删除了错误检查(:
#include "async.h"
#include <unistd.h>
#include <stdio.h>
void myRedisCallback(redisAsyncContext *c, void *typeless_reply, void *priv_data) {
redisReply *r = (redisReply *)typeless_reply;
if (r->type == REDIS_REPLY_STRING)
printf("foo is %sn", r->str);
}
int main() {
redisAsyncContext *c = redisAsyncConnect("localhost", 6379);
redisAsyncCommand(c, myRedisCallback, NULL, "GET foo");
for (int i = 0; i < 100; i++) {
redisAsyncHandleWrite(c); // This sends the command.
redisAsyncHandleRead(c); // This calls the callback if the reply has been received.
usleep(10000); // A real app would do something here.
}
return 0;
}
- 您应该在什么时候创建自己的异常类型
- 如何在C++中创建自己的循环版本?
- 如何在C++中创建自己的编译密钥
- 我正在尝试在视觉工作室上创建自己的库/源函数
- 创建自己的owner_ptr类;在传递堆栈或静态分配的地址时如何避免UB?
- 如何为C++映射创建自己的字符串比较对象
- (如何)在提升几何中创建自己的多边形类型并与之一起使用multi_polygon类型?
- 为什么要创建自己的自定义异常类
- 使用 const char * 与 char * 创建自己的字符串
- 创建自己的线性过滤器
- 如果不在派生类实现中执行此操作,"basic_streambuf"是否会创建自己的获取/放置区域?
- 在 C++ 中创建自己的错误处理机制
- 如何使用新字符串而不是分配器创建自己的字符串类型向量?
- 在C++中创建自己的运算符**?
- Windows:创建自己的杀死程序
- 创建自己的异常(2种方法)C
- 是否可以创建自己的QT注释
- 电子内部或外部方法创建自己的右键单击上下文菜单 - Windows
- 创建自己的链表时出错
- 在 C++ 中创建自己的数据范围