初识Redis · 客户端“Hello world“

发布于:2025-04-19 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

前言:

环境配置

Hello world


前言:

前文我们已经介绍了Redis的不常见的五种数据类型,并且补充了几个渐进式命令和数据库管理命令等,最后简单认识了一下RESP协议,但是老实说,我们只能算是知道了这个协议,对于这个协议的具体细节,我们就要到后面再说了。

但是我们至少知道了RESP编码的某些方式,那么前文其实主要是为了使用定制化的Redis客户端做准备,即从本文开始,我们不再是去使用命令行终端了,我们从本文开始,配置好了对应的环境,我们就可以上手在.cc文件里面写对应的代码了。

不过到时候你就会发现,实际上在.cc里面写redis的代码和我们在命令行参数部分写是非常相似的,这里就不得不提Redis的牛逼之处了,它可以支持50多种语言,非常的强悍。

那么废话不多说,我们直接进入到第一个主题,配置环境。


环境配置

有一句名言说的话,万事开头难,对于环境配置来说,有的时候不比写代码简单,所以我们今天就以Ubuntu系统举例,安装Redis需要的配置吧!

第一步,C++可以依赖的Redis的库有很多,我们这里使用redis-plus-plus,其中redis-plus-plus依赖的是hiredis,所以我们的第一步就是安装hiredis

这点我们直接使用apt install libhiredis-dev即可,不过要注意我们要使用root权限才可以:

当然了因为我这里是已经安装好了的,所以显示的内容和没有安装好的同学是不一样的。

第二步,我们要下载对应的redis-plus-plus源码,它的源码是放在了github上的,我们先从github上把代码拉下来再说,那么怎么访问github就不必多说了~

git clone https://github.com/sewenew/redis-plus-plus.git

安装好了之后,我们就可以看到当前目录有了redis-plus-plus的源代码文件了。

第三步,我们就需要借助到对应的cmake和make工具了,这里的cmake我们可以理解为是用来生成makefile文件的,那么具体的步骤为:

cd redis-plus-plus

mkdir tmp

cd tmp

cmake ..

make

make install

按照这个顺序执行就可以了,单独创建一个tmp目录是因为怕一会make编译的时候,编译产生的临时文件污染了咱们的源码,只能说最好还是这么干。

这里我们完成后,我们可以在/usr/local/include/ 多出来sw目录,至于为什么叫sw,似乎是因为作者名的缩写是sw,在sw里面就包含了redis-plus-plus的一系列文件了。

并且会在/usr/local/lib里面多出来一系列的libredis文件,即库文件咯。

执行完毕之后,我们就可以把redis-plus-plus目录删除了。然后,我们就可以开始我们的redis编程之路了,主要是因为make install已经把我们所要的文件移动到正确的位置了,我们就可以当甩手掌柜了。

那么接下来,我们就进入到redis的编程吧!


Hello world

我们的操作并不是要打一个Hello world,不过无论是学习C++还是Linux,我们似乎都有一个执念就是打印一个Hello world看看。

此处的Hello world是我们能够跑通我们的第一个Hello world程序就可以了。这里我们的Helloworldd的主要操作就是通过ping操作,看我们是否能够返回一个PONG即可,这个点我们在前文没有提及,即Redis在传输层使用的协议是TCP,所以但是又不完全是TCP协议,它只是利用了TCP的连接特性而已。

但是我们可以通过这个连接,来判断我们的Redis客户端是否和服务器连上了。

那么首先我们要创建一个Redis类,我们都知道的,数据类型一般都有自己对应的头文件,Redis也不例外,我们在Redis要使用的头文件是redis++.h,那么为什么它叫redis++呢?

这其实就是redis-plus-plus的缩写咯,但是我们直接包含是不行的,我们需要在库中找到对应的位置,使用命令find就可以找到:

那么很明显,我们要用到的是第一个sw/redis++,所以我们就可以在文件中包含我们的redis++.h了:

#include <sw/redis++/redis++.h>

这个redis++里面就包含了很多很多的redis的头文件了,我们今天只是走一个hello world,所以只需要包含redis++.h即可。

#include <iostream>
#include <sw/redis++/redis++.h>
int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    std::string result = redis.ping();
    std::cout << result << std::endl;
    return 0;
}   

第一个点,Redis的这个类是在sw::redis的这个类里面的,我们初始化的时候使用的tcp://URL固定格式来连接对应的机器,因为我们是连接自己的本地机器,所以我们直接就是127.0.0.1即可,后面跟上对应的端口号。此时你不能还在好奇为什么是6379吧?我们用netstat也可以验证:

它默认的端口号就是6379咯。

我们目前创建了一个redis类,然后我们可以调用ping命令,与机器连接,它的底层原理实际上是给机器发送了PING,服务器收到了这个请求返回的是PONG,如果Redis创建失败或者主机不可达,就会抛异常,此时我们是可以使用try catch进行捕获的。

第二个点,ping返回的PONG是一个字符串,那么我们用string接受一下就可以了。

那么我们makefile也写好了,尝试编译一下?

hello:hello.cc
	g++ -o $@ $^ -std=c++17 

.PHONY:clean
clean:
	rm -f hello

一编译,发现欸我擦,怎么这么多报错?这实际上是因为我们没有链接到redis自身的库,就像我们写线程一样,C++本地的库倒是都有了,但是redis的这些函数,比如ping()都是由redis-plus-plus提供的,都是不在C++的本地库里面的,我们就需要手动指定了。

我们需要手动指定两个,一个是hiredis.a一个是libredis++.a,前者是因为redis-plus-plus依赖的是hiredis,libredis++.a是因为它是各种函数依赖的库。

那么我们同样先使用find命令查找一下:

我们就成功找到了两条路径,分别是/usr/local/lib/libredis++.a/usr/lib/x86_64-linux-gnu/libhiredis.a
这两个库就是我们需要的库文件了。

那么我们就需要在makefile里面引入:

hello:hello.cc
	g++ -o $@ $^ -std=c++17 /usr/local/lib/libredis++.a /usr/lib/x86_64-linux-gnu/libhiredis.a 

.PHONY:clean
clean:
	rm -f hello

此时我们确实能够正确编译了,但是差点意思,我们最好要把线程库连接上,因为对于redis-plus-plus内部的实现用到了线程的多种机制,不管是线程池也好,还是锁的机制也好,都是用到了线程的这个库,哪怕我们是编译阶段没有出现问题,我们在链接阶段也是可能出问题的。

所以,我们一共要链接三个文件,一个是libredis++.a一个是libhiredis.a一个是pthread

hello:hello.cc
	g++ -o $@ $^ -std=c++17 /usr/local/lib/libredis++.a /usr/lib/x86_64-linux-gnu/libhiredis.a -lpthread

.PHONY:clean
clean:
	rm -f hello

那么我们现在运行一下:

也算是成功运行了。

此时,我们就算踏进了Redis定制化客户端的大门了~


感谢阅读!


网站公告

今日签到

点亮在社区的每一天
去签到