Redis的C++与JavaScript访问操作

上篇简单介绍了Redis及其安装部署,这篇记录一下如何用C++语言和JavaScript语言访问操作Redis

1. Redis的接口访问方式(通用接口或者语言接口)

很多语言都包含Redis支持,Redis也提供了JavaC/C++C#PHPJavaScriptPerlObject-CPythonRubyErlang等客户端,使用很方便。下面这个网址是Redis官方提供的客户端,包含了很多语言:

https://redis.io/clients

 

 

ODBC:(付费)

 

 

Redis ODBC驱动程序是一个功能强大的工具,允许您直接从支持ODBC连接的任何应用程序连接Redis高性能数据存储。通过标准ODBC驱动程序接口读取,写入和更新Redis数据。

JDBChttps://code.google.com/p/jdbc-redis/

 

 

WebService:(暂未找到)

Restful:(暂未找到)

2. C++语言或者JavaScript语言调用Redis接口的可行性以及易用性的对比

2.1 C/C++语言调用Redis接口

目前C/C++操作Redis的方法主要分为两种:

  1. C/C++操作Redis数据库需要通过hiredis.h接口实现,目前只能在Linux环境使用,hiredis.h的下载地址为:https://github.com/redis/hiredis  。解压hiredis源码后,终端下进入源码目录,然后输入make命令编译即可,编译后将分别得到静态及动态库文件:libhiredis.a / libhiredis.so,然后结合头文件就可以在工程中使用redis了,几个基本的函数就可以操作redis数据库。

函数原型:redisContext *redisConnect(const char *ip, int port);

说明:该函数用来连接Redis数据库,参数为数据库的ip地址和端口,一般redis数据库的端口为6379

函数返回值:该函数返回一个结构体redisContext

类似的提供了一个函数redisContext* redisConnectWithTimeout(const char *ip, int port, timeval tv),以带有超时的方式连接redis服务器,同时获取与redis连接的上下文对象。

函数原型:void *redisCommand(redisContext *c, const char *format, ...);

说明:该函数执行命令,就如sql数据库中的SQL语句一样,只是执行的是redis数据库中的操作命令,第一个参数为连接数据库时返回的redisContext,剩下的参数为变参,就如C标准函数printf函数一样的变参。

函数返回值:返回值为void*,一般强制转换成为redisReply类型,以便做进一步处理。 函数原型void freeReplyObject(void *reply);

说明:释放redisCommand执行后返回的redisReply所占用的内存

 函数返回值:无

函数原型:void redisFree(redisContext *c);

说明:释放redisConnect()所产生的连接。

函数返回值:无。

具体步骤如下:

安装好hiredis后,进入目录执行make install:

 

 

执行过后则会将hiredis.h等文件 copy/usr/local/include/hiredis/

会将 lib文件放入/usr/local/lib/ 中。

创建一个测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include <stdio.h>
 
#include <stdlib.h>
 
#include <stddef.h>
 
#include <stdarg.h>
 
#include <string.h>
 
#include <assert.h>
 
#include <hiredis/hiredis.h>
 
void doTest()
 
{
 
//redis默认监听端口为6387 可以再配置文件中修改
 
redisContext* c = redisConnect("127.0.0.1", 6379);
 
if ( c->err)
 
{
 
redisFree(c);
 
printf("Connect to redisServer faile\n");
 
return ;
 
}
 
printf("Connect to redisServer Success\n");
 
  
 
const char* command1 = "set stest1 value1";
 
redisReply* r = (redisReply*)redisCommand(c, command1);
 
  
 
if( NULL == r)
 
{
 
printf("Execut command1 failure\n");
 
redisFree(c);
 
return;
 
}
 
if( !(r->type == REDIS_REPLY_STATUS && strcasecmp(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 stest1";
 
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 'stest1' is %d.\n", length);
 
printf("Succeed to execute command[%s]\n", command2);
 
  
 
  
 
const char* command3 = "get stest1";
 
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 'stest1' is %s\n", r->str);
 
freeReplyObject(r);
 
printf("Succeed to execute command[%s]\n", command3);
 
  
 
const char* command4 = "get stest2";
 
r = (redisReply*)redisCommand(c, command4);
 
if ( r->type != REDIS_REPLY_NIL)
 
{
 
printf("Failed to execute command[%s]\n",command4);
 
freeReplyObject(r);
 
redisFree(c);
 
return;
 
}
 
freeReplyObject(r);
 
printf("Succeed to execute command[%s]\n", command4);
 
  
 
  
 
redisFree(c);
 
  
 
}
 
  
 
int main()
 
{
 
doTest();
 
return 0;
 
}

  

使用 g++ -lhiredis -o redisTest redisTest .cpp命令进行编译:

 

 

运行:

 

 

此外,开源的基于C++11boost::asio的跨平台redis接口,可以实现C++操作redis,在windows环境Linux环境下都可以使用,基本步骤如下:

第一步:安装好redis,开启redis server

第二步:将代码下载下来,目录结构如下:

 

 

其中:

src目录里面就是所有用到的api,基于boost::asio写的,可以跨平台调用

examples里面是一些跟redis连接的例子

tests里面有单元测试的例子

第三步:创建demo工程

src目录拷贝到demo工程目录,并配置好boost

编写同步和异步两种方式的应用实例

详见:https://github.com/nekipelov/redisclient

2.2 JavaScript语言调用Redis接口

以下是Redis官方https://redis.io/clients提供的Node.js客户端,其中带星的是其推荐的方式。

 

 

在此之前,需要先在Linux上安装部署node.js并配置环境变量。

首先下载node.jsLinux版并解压出来,https://nodejs.org/en/download/

 

 

打开解压后的bin文件夹,里面有两个文件nodenpm

 

 

接下来创建软连接并配置环境变量

创建软连接

 

 

配置环境变量

 

 

 

运行

 

 

安装RedisNode.js的支持 https://redis.io/clients#nodejsLinux):

 

 

 

 

开启redis-server端:

 

 

连接Redis代码:

 

 

利用程序获取redis中的值

 

 

 

 

2.3 C/C++语言和JavaScript语言访问Redis接口易用性的对比

综上所述,C/C++语言和Node.js都可以访问Redis接口,但C++语言访问Redis时需要自己编译hiredis源码或者安装boost库,相对来说还是JavaScript访问操作Redis更为简单高效。

posted @   花菜饸饹  阅读(2517)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
点击右上角即可分享
微信分享提示