当前位置: 首页 > news >正文

初识Redis · 客户端“Hello world“

目录

前言:

环境配置

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.ccg++ -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.ccg++ -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.ccg++ -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定制化客户端的大门了~


感谢阅读!

http://www.xdnf.cn/news/18055.html

相关文章:

  • 研0大模型学习(第四、五天)
  • java输出HelloWorld
  • 微服务调用中的“大对象陷阱”:CPU飙高问题解析与优化
  • 华为openEuler操作系统全解析:起源、特性与生态对比
  • 大模型微服务架构模块实现方案
  • CAPL编程系列_02
  • windows dns远程添加A记录
  • Android 证书 是什么
  • Redis ③-Linux下载Redis
  • 长图分段打印方法
  • Linux:通过ssh实现端口转发
  • 2025接口测试趋势前瞻:核心策略、工具演进与实战场景解析
  • golang context源码
  • kkFileView安装及使用
  • 深入浅出 Multi-Head Attention:原理 + 例子 + PyTorch 实现
  • 数字信号处理技术架构与功能演进
  • 鸿蒙语言基础
  • 如何在直播App中集成美颜SDK?人脸美型功能从0到1实现指南
  • 基于 HT 数字孪生智慧交通可视化系统
  • 安卓App中调用升级接口并实现版本检查和升级功能的完整方案
  • IP检测工具“ipjiance”
  • MySQL锁详解
  • 2025年大数据实训室建设及大数据实训平台解决方案
  • Vmware esxi 查看硬盘健康状况
  • 【深度学习】张量计算:爱因斯坦求和约定|tensor系列03
  • 如何才能学会代数几何,代数几何的前置学科是什么
  • 使用Trae CN分析项目架构
  • 理解.NET Core中的配置Configuration
  • 时序逻辑电路——序列检测器
  • 【Contiki】Contiki process概述