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

redis-plus-plus安装与使用

目录

一.安装 hiredis

二.接口

三.使用

 四.总结


C++ 操作 redis 的库有很多. 咱们使用 redis-plus-plus.

这个库的功能强大, 使用简单.

Github 地址: https://github.com/sewenew/redis-plus-plus

一.安装 hiredis

redis-plus-plus 是基于 hiredis 实现的.

hiredis 是一个 C 语言实现的 redis 客户端.

因此需要先安装 hiredis. 直接使用包管理器安装即可.

apt install libhiredis-dev

下载 redis-plus-plus 源码

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

编译/安装 redis-plus-plus

使用 cmake 构建

cd redis-plus-plus
mkdir build
cd build
cmake ..
make
sudo make install

        构建成功后, 会在 /usr/local/include/ 中多出 sw 目录, 并且内部包含 redis-plus-plus 的一系列头文件.

        会在 /usr/local/lib/ 中多出一系列 libredis 库文件.

二.接口

        redis 本身支持很多数据类型的键值对,但是在聊天室项目中只涉及到了字符串键值对的操作,因此这里主要介绍字符串键值对的基础操作。

namespace sw 
{namespace redis {struct ConnectionOptions {std::string host;int port = 6379;std::string path;std::string user = "default";std::string password;int db = 0; // 默认 0 号库bool keep_alive = false;}struct ConnectionPoolOptions {std::size_t size = 1; //最大连接数量}class Redis {// uri e.g 'tcp://127.0.0.1:6379'explicit Redis(const std::string& uri);explicit Redis(const ConnectionOptions& connection_opts, const ConnectionPoolOptions& pool_opts = {})//删除当前库中所有数据void flushdb(bool async = false);//删除指定键值对long long del(const StringView& key);//判断指定键值对是否存在long long exists(const StringView& key);//获取一个 string 键值对OptionalString get(const StringView& key);//存放一个 string 键值对,且设置过期时间-毫秒bool set(const StringView& key, const StringView& val, const std::chrono::milliseconds& ttl =std::chrono::milliseconds(0), // 0 表示不设置超时UpdateType type = UpdateType::ALWAYS);void setex(const StringView& key,long long ttl,const StringView& val);//向一个列表中尾插/头插 string 键值对long long rpush(const StringView& key, const StringView& val);long long lpush(const StringView& key, const StringView& val);long long rpush(const StringView& key,Input first, Input last);// std::vector<std::string> elements;// redis.lrange("list", 0, -1, std::back_inserter(elements));void lrange(const StringView& key,long long start, long long stop, Output output);}}
}

三.使用

这里只进行字符串键值对的增删改查操作以及数据的生命周期设置。

main.cc:

#include <sw/redis++/redis.h>
#include <iostream>
#include <string>
#include <thread>
#include <gflags/gflags.h>DEFINE_bool(redis_keep_alive, true, "是否保持长连接");
DEFINE_int32(redis_db, 0, "redis 库号");
DEFINE_int32(redis_port, 6379, "redis 服务器端口");
DEFINE_string(redis_host, "127.0.0.1", "redis 服务器 IP 地址");std::shared_ptr<sw::redis::Redis> predis;void add()
{predis->set("用户会话 1", "用户 ID1");predis->set("用户会话 2", "用户 ID2",std::chrono::milliseconds(1000)); // 设置 1000ms 过期时间predis->set("用户会话 3", "用户 ID3");predis->set("用户会话 4", "用户 ID4");predis->set("用户会话 5", "用户 ID5");
}void get()
{auto res1 = predis->get("用户会话 1");if (res1)std::cout << *res1 << std::endl;auto res2 = predis->get("用户会话 2");if (res2)std::cout << *res2 << std::endl;auto res3 = predis->get("用户会话 3");if (res3)std::cout << *res3 << std::endl;auto res4 = predis->get("用户会话 4");if (res4)std::cout << *res4 << std::endl;auto res5 = predis->get("用户会话 5");if (res5)std::cout << *res5 << std::endl;
}void update()
{predis->set("用户会话 1", "用户 ID 变成 31");predis->set("用户会话 4", "用户 ID 变成 41",std::chrono::milliseconds(1000));predis->del("用户会话 5");
}void push_test()
{predis->rpush("群聊会话 1", "成员 1");predis->rpush("群聊会话 1", "成员 2");predis->rpush("群聊会话 1", "成员 3");predis->rpush("群聊会话 1", "成员 4");predis->rpush("群聊会话 1", "成员 5");predis->rpush("群聊会话 2", "成员 6");predis->rpush("群聊会话 2", "成员 7");predis->rpush("群聊会话 2", "成员 8");predis->rpush("群聊会话 2", "成员 9");predis->rpush("群聊会话 2", "成员 0");std::vector<std::string> res;predis->lrange("群聊会话 1", 0, -1, std::back_inserter(res));for (const auto &r : res){std::cout << r << std::endl;}
}int main()
{sw::redis::ConnectionOptions opts;opts.host = FLAGS_redis_host;opts.port = FLAGS_redis_port;opts.db = FLAGS_redis_db;opts.keep_alive = FLAGS_redis_keep_alive;predis = std::make_shared<sw::redis::Redis>(opts);std::cout << "--------add-------\n";add();std::cout << "--------get-------\n";get();std::cout << "--------2s get-------\n";std::this_thread::sleep_for(std::chrono::seconds(2));get();std::cout << "--------update-------\n";update();std::cout << "--------2s get-------\n";std::this_thread::sleep_for(std::chrono::seconds(2));get();std::cout << "--------push-------\n";push_test();return 0;
}

makefile:

main : main.ccg++ -std=c++17 $^ -o $@ -lredis++ -lhiredis -lgflags -pthread

运行结果:

 四.总结

        本篇文章是专注于我项目中使用到的客户端redis-plus-plus来进行介绍和简单使用,供大家和本人在日常开发中进行参考。

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

相关文章:

  • 【vue-7】Vue3 响应式数据声明:深入理解 reactive()
  • 敏捷开发的历史演进:从先驱实践到全域敏捷(1950s-2025)
  • ubuntu 24.04 xfce4 钉钉输入抢焦点问题
  • XSS的学习笔记
  • ChatIM项目语音识别安装与使用
  • 拓展面试题之-rabbitmq面试题
  • [Python] -项目实战8- 构建一个简单的 Todo List Web 应用(Flask)
  • pip关于缓存的用法
  • Python Web框架详解:Flask、Streamlit、FastAPI
  • Pinia 核心知识详解:Vue3 新一代状态管理指南
  • 算法-递推
  • 在通信仿真场景下,Python 和 MATLAB 的性能差异主要体现在运行效率、并行计算、库支持、开发效率等方面。以下是基于最新资料的对比总结
  • AS32X601 系列 MCU 硬件最小系统设计与调试方案探析
  • Web-SQL注入数据库类型用户权限架构分层符号干扰利用过程发现思路
  • 基于SHAP的特征重要性排序与分布式影响力可视化分析
  • 两个路由器通过不同的网段互联
  • 【PTA数据结构 | C语言版】邻接矩阵表示的图基本操作
  • TD3与SAC强化学习算法深度对比
  • 六边形滚动机器人cad【7张】三维图+设计书明说
  • Github 贪吃蛇 主页设置
  • day057-docker-compose案例与docker镜像仓库
  • Fortinet FortiWeb sql注入导致RCE漏洞复现(CVE-2025-25257)
  • XSS漏洞总结
  • 前端基础知识Vue系列 - 11(Vue组件之间的通信方式)
  • CVE-2022-41128
  • 2024年全国青少年信息素养大赛Scratch编程挑战赛 小低组初赛
  • 深入解析Hadoop中的EditLog与FsImage持久化设计及Checkpoint机制
  • [学习] 双边带调制 (DSB) 与单边带调制 (SSB) 深度对比
  • 【工具变量】地级市城市包容性绿色增长数据(2011-2023年)
  • 明细列表,明细grid中的默认按钮失效,配置按钮失效