linux系统C语言通过hiredis库来连接操作redis,可以通过redisSetTimeout来设置操作的超时时间。
int redisSetTimeout(redisContext *c, const struct timeval tv);
对于建立redis连接的超时需要通过redisConnectWithTimeout来连接redis。
redisContext *redisConnectWithTimeout(const char *ip, int port, const struct timeval tv);
本文通过阻塞连接redis后设置对redis操作的超时,代码如下。
编译命令(文件名保存为redis-timeout.cpp)
g++ -g redis-timeout.cpp -o redis-timeout -lhiredis
[root@k8s-node2 redis]# ./redis-timeout
Command successful
Command successful
#include <iostream>
#include <hiredis/hiredis.h>
#include <time.h>
#include <string.h>
bool check_reply(redisContext *c, redisReply* reply) {
if (reply == NULL) {
std::cerr << "Error: " << c->errstr << std::endl;
return false;
}
// 检查回复是否超时
if (reply->type == REDIS_REPLY_STATUS && strcmp(reply->str, "OK") == 0) {
std::cout << "Command successful" << std::endl;
return true;
} else if (reply->type == REDIS_REPLY_ERROR && strstr(reply->str, "timeout") != NULL) {
std::cout << "Command timed out" << std::endl;
} else {
std::cout << "Command failed" << std::endl;
}
return false;
}
int main() {
redisContext *c = redisConnect("127.0.0.1", 6379);
if (c == NULL || c->err) {
if (c) {
std::cerr << "Error: " << c->errstr << std::endl;
redisFree(c);
} else {
std::cerr << "Can't allocate redis context" << std::endl;
}
return 1;
}
//"password"改为连接redis需要的密码
redisReply *reply = static_cast<redisReply*>(redisCommand(c, "auth %s", "password"));
if(!check_reply(c, reply)) {
freeReplyObject(reply);
redisFree(c);
return 1;
}
struct timeval tv;
tv.tv_sec = 0; //单位秒
tv.tv_usec = 10; //单位微妙
redisSetTimeout(c, tv); // 设置10微秒超时时间
reply = static_cast<redisReply*>(redisCommand(c, "set hello 1"));
check_reply(c, reply);
freeReplyObject(reply);
redisFree(c);
return 0;
}