4.客户端(Redis)

1.简介

之前的各种 redis 的基本操作/命令,都是在 redis 命令行客户端,手动执行的,这种操作方式不是我们日常开发中主要的形式。

更多的时候,是使用 redis 的api,来实现定制化的 redis 客户端程序,进一步操作 redis 服务器。

为什么我们能编写出一个自定义的redis 客户端??

我们能不能编写出一个qq的自定义客户端??

不能!!因为他们没有公开自己使用的自定义协议

2.RESP协议

是 Redis 客户端与服务器之间通信使用的专用协议,设计目标是简单易实现、解析高效、人类可读。它定义了客户端与 Redis 服务器之间数据交换的格式规范,所有 Redis 命令和响应都通过 RESP 格式传输。

复制代码
优点:
1.简单好实现
2.快速进行分析
3.肉眼可读

传输层这里基于 TCP,但是和 TCP 又没有强耦合;请求和相应之间的通信模型是一问一答的形式--客户端给服务器发一个请求,服务器返回一个响应。

3.Redis-plus-plus 安装

C++ 操作 redis 的库有很多,我们使用 redis-plus-plus。(库有很多,大同小异)

githup 找第三方库/程序的一个重要渠道!!(可以用加速器watt tools来合法打开)
Github 地址: https://github.com/sewenew/redis-plus-plus

安装 hiredis

redis-plus-plus 是基于 hiredis 实现的.
hiredis 是⼀个 C 语⾔实现的 redis 客⼾端.
因此需要先安装 hiredis. 直接使⽤包管理器安装即可

sql 复制代码
Ubuntu
1.apt install libhiredis-dev

2.下载 redis-plus-plus 源码
git clone https://github.com/sewenew/redis-plus-plus.git

3.编译/安装 redis-plus-plus
Ubuntu
使⽤ cmake 构建

cd redis-plus-plus

mkdir build

cd build

cmake ..

make

make install # 这⼀步操作需要管理员权限. 如果是⾮ root ⽤⼾, 使⽤ sudo make 
install 执⾏.

构建成功后, 会在 /usr/local/include/ 中多出 sw ⽬录, 并且内部包含 redis-plus-plus 的⼀
系列头⽂件.
会在 /usr/local/lib/ 中多出⼀系列 libredis 库⽂件

完事!!!

redis-plus-plus 本体,只能编译安装(使用 ubuntu 会比使用 centos 简单很多)

optional 类型(补充说名)

在 C++ 中,optional 类型(std::optional,C++17 引入)是一种特殊的容器 / 包装类型,用于表示一个 "可能存在或不存在" 的值。它的核心作用是优雅地处理 "值可能缺失" 的场景 ,避免使用特殊值(如 nullptr-1 等)来表示 "无值" 的情况,让代码更清晰、更安全。

std::optional 的特点:

  1. 可能包含一个值,也可能为空:可以理解为 "有值" 或 "无值" 两种状态
  2. 模板类型std::optional<T> 中的 T 是它可能存储的值的类型(如 std::optional<int> 可存储 int 或为空)
  3. 需要包含头文件 :使用时需引入 <optional>

常用操作:

  • 创建

    cpp

    运行

    复制代码
    std::optional<int> opt1;                // 默认为空(无值)
    std::optional<int> opt2 = 42;           // 包含值 42
    std::optional<int> opt3 = std::nullopt; // 显式指定为空(nullopt 是特殊标记)
  • 判断是否有值

    cpp

    运行

    复制代码
    if (opt2.has_value()) { ... }  // 方法1:has_value() 返回 bool
    if (opt2) { ... }              // 方法2:隐式转换为 bool(更简洁)
  • 获取值

    cpp

    运行

    复制代码
    int val = opt2.value();  // 方法1:有值时返回值,无值时抛异常
    int val = *opt2;         // 方法2:有值时返回值,无值时行为未定义(需先判断)
    int val = opt2.value_or(0); // 方法3:有值时返回值,无值时返回默认值 0

适用场景:

  • 函数返回值可能 "不存在" 的情况(如查找操作未找到结果):

    cpp

    运行

    复制代码
    // 查找向量中第一个偶数,找不到则返回空
    std::optional<int> findFirstEven(const std::vector<int>& nums) {
        for (int n : nums) {
            if (n % 2 == 0) return n;
        }
        return std::nullopt; // 无结果
    }
  • 避免使用 "魔法值"(如用 nullptr 表示指针无效,用 -1 表示错误码),让代码意图更明确。简单说,std::optional<T> 就像一个 "可能装着 T 类型数据的盒子"------ 你可以检查盒子里有没有东西,有就拿出来用,没有就做相应处理,比用特殊值表示 "无结果" 更安全、更易读。


1.不能开放 redis 的端口

2.我们自己又想要能够通过外网访问~

相关推荐
kirs_ur1 天前
ECC & LDPC — SSD 的数据卫士
服务器·数据库·性能优化
是三一seven1 天前
Sql注入基础
数据库·安全·网络安全
互联网中的一颗神经元1 天前
小白python入门 - 39. 采集流水线小项目
开发语言·python
Sirens.1 天前
MySQL表设计进阶-约束范式连接索引与事务
android·数据库·mysql
徐小夕1 天前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
Wang's Blog1 天前
Go-Zero 项目开发22:用户群聊功能的实现与完善
开发语言·golang
a1117761 天前
坦克大战3D Three.js 3D (开源项目)
开发语言·javascript·3d
字节跳动开源1 天前
火山引擎开源 Agent 驱动的搜索自迭代技术
数据库·开源·agent
Wang's Blog1 天前
Go-Zero项目开发24: 基于Bitmap实现群聊消息已读未读
开发语言·后端·golang
Oo大司命oO1 天前
藏在正则表达式里的陷阱
数据库·mysql·正则表达式