当前位置: 首页 > 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定制化客户端的大门了~


感谢阅读!

相关文章:

  • R 语言科研绘图 --- 饼状图-汇总
  • Yum镜像源
  • 中间件--ClickHouse-10--海量数据存储如何抉择ClickHouse和ES?
  • 【系统分析师】-软件工程
  • 【文件操作与IO】详细解析文件操作与IO (一)
  • 探索 Higress:下一代云原生 API 网关
  • 前端融合图片mask
  • 高级java每日一道面试题-2025年4月13日-微服务篇[Nacos篇]-Nacos如何处理网络分区情况下的服务可用性问题?
  • ubantu18.04(Hadoop3.1.3)之MapReduce编程
  • pnpm解决幽灵依赖问题
  • Model Context Protocol (MCP) 开放协议对医疗多模态数据整合的分析路径【附代码】
  • Kaamel隐私与安全分析报告:Microsoft Recall功能评估与风险控制
  • hadoop和Yarn的基本介绍
  • 使用Java动态数据生成PDF报告:简化您的报告导出流程
  • AI语音助手 React 组件使用js-audio-recorder实现,将获取到的语音转成base64发送给后端,后端接口返回文本内容
  • kafka菜鸟教程
  • Android 证书 是什么
  • 在服务器上安装安装mysql
  • C#获取当前方法的命名空间、类名称、方法名称以及方法的参数信息
  • 【区块链通用服务平台及组件】京北方分布式身份管理平台 | FISCO BCOS 应用案例
  • 生于1984年,马玥已任辽宁锦州北镇市代市长
  • 银行板块整体走强,工行、农行、中行股价再创新高
  • 国防部:“台独”武装摆练纯属搞心理安慰,怎么演都是溃败的死局
  • 外交部回应菲律宾涉仁爱礁言论:菲方7轮运补均提前通报中方
  • 接棒路颖,国泰海通证券副总裁谢乐斌履新海富通基金董事长
  • 远香湖畔“戏”味浓,“吾嘉有戏”探索戏剧与图书跨界融合