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.我们自己又想要能够通过外网访问~

相关推荐
云和数据.ChenGuang4 小时前
MongoDB 提供的 `GridFSTemplate` 操作 GridFS 大文件系统的常用查询方式
数据库·mongodb
梦想CAD控件5 小时前
网页CAD中组(Group)功能的二次开发
前端·javascript·github
青牛科技-Allen5 小时前
7个常见的DFM问题及其对PCB制造的影响
开发语言·单片机·制造·usb麦克风·立体声录音笔
「QT(C++)开发工程师」5 小时前
C++语言编程规范-风格
linux·开发语言·c++·qt
hello kitty w5 小时前
Python学习(10) ----- Python的继承
开发语言·python·学习
newxtc5 小时前
【广州公共资源交易-注册安全分析报告-无验证方式导致安全隐患】
开发语言·selenium·安全·yolo
懒羊羊不懒@5 小时前
Java一、二维数组
开发语言·python
爱学习的小鱼gogo5 小时前
python 单词搜索(回溯-矩阵-字符串-中等)含源码(二十)
开发语言·数据结构·python·矩阵·字符串·回溯·递归栈
徐同保5 小时前
Redux和@reduxjs/toolkit同时在Next.js项目中使用
开发语言·前端·javascript