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

Redis 简介与 redis-plus-plus 使用指南

Redis介绍与安装

Redis(Remote Dictionary Server)是一个开源的高性能键值对(key-value)数据库。它通常用作数据结构服务器,因为除了基本的键值存储功能外,Redis 还支持多种类型的数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)以及范围查询、位图、超日志和地理空间索引等。以下是 Redis 的一些主要特性:

1.内存中数据库:Redis 将所有数据存储在内存中,这使得读写速度非常快。

2.持久化:尽管 Redis 是内存数据库,但它提供了持久化选项,可以将内存中的数据保存到磁盘上,以防系统故障导致数据丢失。

3.支持多种数据结构:Redis 不仅支持基本的键值对,还支持列表、集合、有序集合等复杂的数据结构。

4.原子操作:Redis 支持原子操作,这意味着多个操作可以作为一个单独的原子步骤执行,这对于并发控制非常重要。

5.发布/订阅功能:Redis 支持发布订阅模式,允许多个客户端订阅消息,当消息发布时,所有订阅者都会收到消息。

6.高可用性:通过 Redis 哨兵(Sentinel)和 Redis 集群,Redis 可以提供高可用性和自动故障转移。

7.复制:Redis 支持主从复制,可以提高数据的可用性和读写性能

8.事务:Redis 提供了事务功能,可以保证一系列操作的原子性执行。

9.Lua 脚本:Redis 支持使用 Lua 脚本进行复杂的数据处理,可以在服务器端执行复杂的逻辑。

10.客户端库:Redis 拥有丰富的客户端库,支持多种编程语言,如 Python、Ruby、Java、C# 等。

11.性能监控:Redis 提供了多种监控工具和命令,可以帮助开发者监控和优化性能。

12.易于使用:Redis 有一个简单的配置文件和命令行界面,使得设置和使用变得容易。Redis 广泛用于缓存、会话存储、消息队列、排行榜、实时分析等领域。由于其高性能和灵活性,Redis 成为了现代应用程序中非常流行的数据存储解决方案之一。

安装

sudo apt-get intsall redis -y

支持远程连接

修改 /etc/redis/redis.conf
修改 bind 127.0.0.1 为 bind 0.0.0.0
修改 protected-mode yes 为 protected-mode no

控制 Redis 启动

# 启动 Redis 服务
service redis-server start
# 停止 Redis 服务
service redis-server stop
# 重启 Redis 服务
service redis-server restart

redis-plus-plus

C++ 操作 redis 的库有很多,咱们此处使用 redis-plus-plus,这个库的功能强大,使用简单。

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

安装 hiredis

redis-plus-plus 是基于 hiredis 实现的,hiredis 是一个 C 语言实现的 redis 客户端。因此需要先安装 hiredis,直接使用包管理器安装即可

sudo apt-get -y 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 # 这一步操作需要管理员权限. 如果是非 root 用户, 使用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);};}
}

使用案例

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

#include <string>#include <sw/redis++/redis.h>
#include <gflags/gflags.h>
#include <iostream>
#include <thread>DEFINE_string(ip, "127.0.0.1", "这是服务器的IP地址,格式为:127.0.0.1");
DEFINE_int32(port, 6379, "这是服务器的端口号,格式为:8080");
DEFINE_int32(db, 0, "库的编号,默认是0号");
DEFINE_bool(keep_alive, true, "是否进行长连接保活");void print(sw::redis::Redis &client)
{auto user1 = client.get("会话ID1");if (user1)std::cout << *user1 << std::endl;auto user2 = client.get("会话ID2");if (user2)std::cout << *user2 << std::endl;auto user3 = client.get("会话ID3");if (user3)std::cout << *user3 << std::endl;auto user4 = client.get("会话ID4");if (user4)std::cout << *user4 << std::endl;auto user5 = client.get("会话ID5");if (user5)std::cout << *user5 << std::endl;
}void add_string(sw::redis::Redis &client)
{client.set("会话ID1", "用户ID1");client.set("会话ID2", "用户ID2");client.set("会话ID3", "用户ID3");client.set("会话ID4", "用户ID4");client.set("会话ID5", "用户ID5");client.del("会话ID3");// 数据存在则进行修改,不存在就新增client.set("会话ID5", "用户ID555");print(client);
}void expired_test(sw::redis::Redis &client)
{// 这次的新增,数据已经存在,所以为修改// 不仅修改了val,还给新的键值设置了过期时间client.set("会话ID1", "用户ID111", std::chrono::milliseconds(1000));print(client);std::cout << "----------休眠2s------------" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2));print(client);
}void list_test(sw::redis::Redis &client)
{client.rpush("群聊1", "成员1");client.rpush("群聊1", "成员2");client.rpush("群聊1", "成员3");client.rpush("群聊1", "成员4");client.rpush("群聊1", "成员5");std::vector<std::string> users;client.lrange("群聊1", 0, -1, std::back_inserter(users));for (auto user : users){std::cout << user << std::endl;}
}int main(int argc, char *argv[])
{google::ParseCommandLineFlags(&argc, &argv, true);// 实例化redis对象,连接服务器sw::redis::ConnectionOptions options;options.host = FLAGS_ip;options.port = FLAGS_port;options.db = FLAGS_db;options.keep_alive = FLAGS_keep_alive;sw::redis::Redis client(options);// 多次测试让群聊中的数据多次打印,所以先删除库中的所有数据client.flushdb();// 添加字符串键值对,删除键值对,获取字符串键值对add_string(client);std::cout << "-------------------------" << std::endl;// 控制数据的有效时间expired_test(client);// 列表的操作,实现数据的右插,左获取std::cout << "-------------------------" << std::endl;list_test(client);return 0;
}

Makefile:

main : main.ccg++ -std=c++17 $^ -o $@ -lredis++ -lhiredis -lgflags -pthread.PHONY:clean
clean:rm -rf main
http://www.dtcms.com/a/324184.html

相关文章:

  • Gin 框架错误处理机制详解
  • 第三章 向量
  • 如何培养自己工程化的能力(python项目)
  • 编程基础之多维数组——同行列对角线的格
  • Qt中的设计模式:经典的MVC,MVP和MVVM
  • 娃哈哈经销商“大洗牌”:砍掉年销300万以下经销商
  • printf函数格式化输出攻略
  • 本地WSL部署接入 whisper + ollama qwen3:14b 总结字幕校对增强版
  • CodePlan:基于代码形式规划的大模型结构化推理新范式
  • 机器学习——多元线性回归
  • 【2025CVPR-图象分类方向】ProAPO:视觉分类的渐进式自动提示优化
  • 【Tomcat】企业级web应用服务器
  • 【代码随想录day 16】 力扣 112. 路径总和
  • jupyter notebook如何打开其他盘目录
  • 第二章、LSTM(Long Short-term Memory:长短时记忆网络)
  • 【CF】Day124——杂题 (鸽巢原理 | 构造 | 贪心 + 模拟)
  • Excel常用功能函数
  • vue3-基础语法
  • 开启单片机
  • jvm有哪些垃圾回收器,实际中如何选择?
  • 【FPGA】初识FPGA
  • Git 版本管理规范与最佳实践摘要
  • 后量子密码学的迁移与安全保障:迎接量子时代的挑战
  • 【鸿蒙/OpenHarmony/NDK】C/C++开发教程之环境搭建
  • Linux操作系统从入门到实战(十八)在Linux里面怎么查看进程
  • HarmonyOS NEXT系列之编译三方C/C++库
  • 人工智能-python-机器学习-决策树与集成学习:决策树分类与随机森林
  • 给AI装上“翻译聚光灯”:注意力机制的机器翻译革命
  • ECharts Y轴5等分终极解决方案 - 动态适配缩放场景
  • 【走进Docker的世界】Docker的发展历程