VS2017下Redis服务器源码地址
https://download.csdn.net/download/qq_23350817/88541316
VS2017下Redis客户端源码地址(hiredis已完成windows下编译):
https://download.csdn.net/download/qq_23350817/88541242
C代码实现:
#include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <stdarg.h> #include <string.h> #include <assert.h> #include <hiredis.h> void doTest() { //redis默认监听端口为6387 可以再配置文件中修改 redisContext* c = redisConnect("10.10.0.7", 6379); if (c->err) { redisFree(c); printf("Connect to redisServer faile\n"); return; } // 进行身份验证(用户名和密码) redisReply *reply = (redisReply *)redisCommand(c, "AUTH test123"); // 替换为你的 Redis 密码 if (reply == NULL || reply->type == REDIS_REPLY_ERROR) { printf("Authentication failed: %s\n", reply ? reply->str : "NULL"); freeReplyObject(reply); return; } freeReplyObject(reply); reply = redisCommand(c, "SELECT 0"); if (reply == NULL || reply->type == REDIS_REPLY_ERROR) { printf("Error selecting database: %s\n", reply ? reply->str : "NULL"); freeReplyObject(reply); redisFree(c); return; } const char* command = "get auth:third-party:token"; redisReply* r = (redisReply*)redisCommand(c, command); r = (redisReply*)redisCommand(c, command); if (r->type != REDIS_REPLY_STRING) { printf("Failed to execute command[%s]\n", command); freeReplyObject(r); redisFree(c); return; } printf("The value of 'sunx' is %s\n", r->str); freeReplyObject(r); printf("Succeed to execute command[%s]\n", command); redisFree(c); } int main() { doTest(); return 0; }
#include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <stdarg.h> #include <string.h> #include <assert.h> #include <hiredis.h> void doTest() { //redis默认监听端口为6387 可以再配置文件中修改 redisContext* c = redisConnect("10.100.0.127", 6379); if (c->err) { redisFree(c); printf("Connect to redisServer faile\n"); return; } printf("Connect to redisServer Success\n"); const char* command1 = "set sunx 123456789"; redisReply* r = (redisReply*)redisCommand(c, command1); if (NULL == r) { printf("Execut command1 failure\n"); redisFree(c); return; } if (!(r->type == REDIS_REPLY_STATUS && strcmp(r->str, "OK") == 0)) { printf("Failed to execute command[%s]\n", command1); freeReplyObject(r); redisFree(c); return; } freeReplyObject(r); printf("Succeed to execute command[%s]\n", command1); const char* command2 = "strlen sunx"; r = (redisReply*)redisCommand(c, command2); if (r->type != REDIS_REPLY_INTEGER) { printf("Failed to execute command[%s]\n", command2); freeReplyObject(r); redisFree(c); return; } int length = r->integer; freeReplyObject(r); printf("The length of 'sunx' is %d.\n", length); printf("Succeed to execute command[%s]\n", command2); const char* command3 = "get sunx"; r = (redisReply*)redisCommand(c, command3); if (r->type != REDIS_REPLY_STRING) { printf("Failed to execute command[%s]\n", command3); freeReplyObject(r); redisFree(c); return; } printf("The value of 'sunx' is %s\n", r->str); freeReplyObject(r); printf("Succeed to execute command[%s]\n", command3); const char* command4 = "get test"; r = (redisReply*)redisCommand(c, command4); if (r->type != REDIS_REPLY_NIL) { printf("Failed to execute command[%s]\n", command4); freeReplyObject(r); redisFree(c); return; } printf("The value of 'test' is %s\n", r->str); freeReplyObject(r); printf("Succeed to execute command[%s]\n", command4); redisFree(c); } int main() { doTest(); return 0; }
C++代码实现:
#include <iostream> #include <string> #include <winsock2.h> extern "C" { #include <hiredis.h> } #pragma comment(lib, "hiredis.lib") #pragma comment(lib, "Win32_Interop.lib") std::string GetToken() { std::string strToken = ""; std::string ipaddr = "10.100.0.127"; int port = 6379; struct timeval timeout = { 5, 0 }; // 设置超时时间为 5 秒 std::string password = "hlxredis"; std::string setPasswdCmd = "AUTH " + password; std::string tokenKey = "auth:third-party:token"; redisContext* c = redisConnectWithTimeout(ipaddr.c_str(), port, timeout); if (c->err) { redisFree(c); printf("Connect to redisServer faile\n"); return strToken; } redisReply *reply = (redisReply *)redisCommand(c, setPasswdCmd.c_str()); if (reply == NULL || reply->type == REDIS_REPLY_ERROR) { printf("Authentication failed: %s\n", reply ? reply->str : "NULL"); freeReplyObject(reply); return strToken; } freeReplyObject(reply); std::string selectDbCmd = "SELECT 0"; reply = (redisReply *)redisCommand(c, selectDbCmd.c_str()); if (reply == NULL || reply->type == REDIS_REPLY_ERROR) { printf("Error selecting database: %s\n", reply ? reply->str : "NULL"); freeReplyObject(reply); redisFree(c); return strToken; } std::string getTokenCmd = "get " + tokenKey; redisReply* r = (redisReply*)redisCommand(c, getTokenCmd.c_str()); if (r->type != REDIS_REPLY_STRING) { printf("Failed to execute command[%s]\n", getTokenCmd.c_str()); freeReplyObject(r); redisFree(c); return strToken; } strToken = r->str; printf("The value of 'sunx' is %s\n", r->str); freeReplyObject(r); printf("Succeed to execute command[%s]\n", getTokenCmd.c_str()); redisFree(c); return strToken; } int main() { std::cout << "token:" << GetToken() << std::endl;; return 0; }
注意:C++代码实现时,VS2017可能会报错检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”
,此时需要如下修改:
运行结果如下: