在 Ubuntu 上安装和配置 Redis
在 Ubuntu 上安装和配置 Redis,并使用发布-订阅(Pub/Sub)功能,可以按照以下步骤进行:
一、安装 Redis
1. 更新包列表
首先,更新本地的包列表以确保获取到最新的软件包信息:
sudo apt update
2. 安装 Redis
使用 apt
包管理器安装 Redis:
sudo apt install redis-server
3. 验证安装
安装完成后,可以通过以下命令检查 Redis 的运行状态:
sudo systemctl status redis
如果 Redis 正在运行,输出中会显示 active (running)
。
二、配置 Redis
Redis 的主要配置文件位于 /etc/redis/redis.conf
。你可以根据需要进行修改。
1. 编辑配置文件
使用你喜欢的文本编辑器(如 nano
)编辑配置文件:
sudo nano /etc/redis/redis.conf
2. 常见配置选项
-
持久化设置:
- 默认情况下,Redis 使用 RDB 快照持久化。你可以根据需求启用或禁用。
-
绑定地址和端口:
- 默认绑定到
127.0.0.1
,如果需要远程访问,可以修改bind
参数,但需注意安全性。
- 默认绑定到
-
设置密码:
- 为了增强安全性,可以设置访问密码。在配置文件中取消注释并设置
requirepass
:requirepass yourpassword
- 为了增强安全性,可以设置访问密码。在配置文件中取消注释并设置
-
后台运行:
- 默认情况下,Redis 以后台模式运行。确保
daemonize
设置为yes
:daemonize yes
- 默认情况下,Redis 以后台模式运行。确保
3. 重新启动 Redis 服务
在修改配置文件后,重新启动 Redis 服务以应用更改:
sudo systemctl restart redis
4. 设置开机自启
确保 Redis 在系统启动时自动启动:
sudo systemctl enable redis
三、测试 Redis 安装
使用 redis-cli
工具连接到 Redis 服务器并测试:
redis-cli
在 redis-cli
提示符下输入:
PING
如果一切正常,Redis 会回复:
PONG
四、Redis 发布-订阅(Pub/Sub)使用指南
Redis 的发布-订阅功能允许消息在客户端之间实时传递。以下是如何使用 redis-cli
进行发布和订阅的示例。
1. 订阅频道
打开一个终端窗口,运行以下命令订阅一个频道(例如 news
):
redis-cli
在 redis-cli
提示符下输入:
SUBSCRIBE news
你将看到类似如下的输出,表示已成功订阅:
1) "subscribe"
2) "news"
3) (integer) 1
此终端将持续监听 news
频道的消息。
2. 发布消息
打开另一个终端窗口,运行以下命令发布消息到 news
频道:
redis-cli
在 redis-cli
提示符下输入:
PUBLISH news "Hello, Redis Pub/Sub!"
执行后,你将在订阅 news
频道的终端看到如下输出:
(integer) 1
而订阅终端将显示:
1) "message"
2) "news"
3) "Hello, Redis Pub/Sub!"
3. 示例:多个频道和消息
你可以订阅多个频道或使用通配符模式。例如,订阅所有以 news.
开头的频道:
PSUBSCRIBE news.*
发布到不同的频道:
PUBLISH news.sports "Sports news update"
PUBLISH news.weather "Weather forecast update"
订阅终端将接收到相应的消息。
4. 使用密码保护的 Redis 实例
如果 Redis 配置了访问密码,连接时需要提供密码。例如:
redis-cli -a yourpassword
或者在 redis-cli
内使用 AUTH
命令:
AUTH yourpassword
五、进阶使用
除了命令行工具,你还可以在各种编程语言中使用 Redis 的 Pub/Sub 功能。例如,使用 Python 的 redis
库:
import redis# 创建 Redis 连接
r = redis.Redis(host='localhost', port=6379, password='yourpassword')# 订阅频道
pubsub = r.pubsub()
pubsub.subscribe('news')# 监听消息
for message in pubsub.listen():if message['type'] == 'message':print(f"Received message: {message['data'].decode()}")
发布消息:
import redisr = redis.Redis(host='localhost', port=6379, password='yourpassword')
r.publish('news', 'Hello from Python!')
在 Ubuntu 上安装和配置用于 C++ 编程的 Redis 环境,主要包括以下几个步骤:
- 安装 Redis 服务器(如果尚未安装)
- 安装必要的依赖库
- 安装 C++ Redis 客户端库(如
redis-plus-plus
) - 配置开发环境
- 编写和运行示例 C++ 程序
以下是详细的步骤说明:
六、安装 Redis 服务器
如果你还没有在 Ubuntu 上安装 Redis,可以参考之前的回答中的步骤进行安装。如果已经安装,可以跳过此部分。
七、安装必要的依赖库
在安装 redis-plus-plus
之前,需要先安装一些依赖库,包括 hiredis
和 CMake
等。
1. 更新包列表
sudo apt update
2. 安装 hiredis
hiredis
是一个高性能的 Redis C 客户端库,是 redis-plus-plus
的依赖。
sudo apt install libhiredis-dev
3. 安装 CMake
CMake
是一个跨平台的构建系统,用于管理项目的构建过程。
sudo apt install cmake
4. 安装其他依赖
确保安装了编译 C++ 代码所需的编译器和工具:
sudo apt install build-essential
八、安装 redis-plus-plus
(C++ Redis 客户端库)
redis-plus-plus
是一个功能丰富且易于使用的 C++ Redis 客户端库,基于 hiredis
构建。
1. 克隆 redis-plus-plus
仓库
git clone https://github.com/sewenew/redis-plus-plus.git
cd redis-plus-plus
2. 创建构建目录并编译
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
sudo make install
这将编译并安装 redis-plus-plus
库到系统中。
3. 更新库缓存
sudo ldconfig
九、配置开发环境
确保你的 C++ 项目能够找到 redis-plus-plus
和 hiredis
的头文件和库文件。下面以一个简单的 C++ 项目为例,演示如何配置和使用 redis-plus-plus
。
1. 创建项目目录
mkdir ~/redis_cpp_project
cd ~/redis_cpp_project
2. 编写示例代码
创建一个名为 main.cpp
的文件,内容如下:
#include <sw/redis++/redis++.h>
#include <iostream>using namespace sw::redis;int main() {try {// 连接到 Redis 服务器auto redis = Redis("tcp://127.0.0.1:6379");// 设置键值对redis.set("key", "Hello, Redis!");// 获取键的值auto val = redis.get("key");if (val) {std::cout << "key: " << *val << std::endl;} else {std::cout << "key does not exist." << std::endl;}// 发布-订阅示例// 订阅频道auto sub = redis.subscriber();sub.on_message([](std::string channel, std::string msg) {std::cout << "Received message from channel " << channel << ": " << msg << std::endl;});sub.subscribe("news");// 在另一个线程中监听消息std::thread([&sub]() {try {sub.consume();} catch (const std::exception &e) {std::cerr << "Subscriber error: " << e.what() << std::endl;}}).detach();// 发布消息redis.publish("news", "Hello from C++!");// 等待一段时间以确保消息被接收std::this_thread::sleep_for(std::chrono::seconds(1));} catch (const Error &err) {std::cerr << "Redis error: " << err.what() << std::endl;}return 0;
}
3. 编写 CMakeLists.txt
创建一个名为 CMakeLists.txt
的文件,内容如下:
cmake_minimum_required(VERSION 3.5)
project(RedisCppExample)set(CMAKE_CXX_STANDARD 14)find_package(hiredis REQUIRED)
find_package(redis++ REQUIRED)add_executable(redis_cpp_example main.cpp)target_link_libraries(redis_cpp_example PRIVATE redis++ hiredis::hiredis)
4. 构建项目
mkdir build
cd build
cmake ..
make
5. 运行示例程序
确保 Redis 服务器正在运行,然后执行:
./redis_cpp_example
你应该会看到类似如下的输出:
key: Hello, Redis!
Received message from channel news: Hello from C++!
十、进一步学习和参考
1. 官方文档
redis-plus-plus
GitHub 仓库hiredis
GitHub 仓库
2. 示例代码
redis-plus-plus
仓库中包含多个示例代码,展示了如何使用不同的功能。可以参考这些示例来扩展你的项目。
3. 编程指南
- 连接 Redis:如何配置连接选项,如密码验证、SSL 等。
- 基本操作:字符串、哈希、列表、集合、有序集合等数据结构的操作。
- 发布-订阅:高级用法,如模式订阅、消息过滤等。
- 事务和管道:如何在 C++ 中使用 Redis 的事务和管道功能。
- 异步操作:使用异步 API 以提高性能和响应性。
十一、常见问题排查
1. 编译错误
如果在编译过程中遇到找不到 redis-plus-plus
或 hiredis
的头文件或库文件,确保它们已正确安装,并且 CMakeLists.txt
中的 find_package
指令能够找到它们。
2. 运行时错误
如果运行时无法连接到 Redis 服务器,请确保 Redis 服务器正在运行,并且连接地址和端口正确。
3. 权限问题
如果 Redis 配置了访问密码,在连接时需要提供密码。例如:
auto redis = Redis("tcp://127.0.0.1:6379?password=yourpassword");
相关文章:
在 Ubuntu 上安装和配置 Redis
在 Ubuntu 上安装和配置 Redis,并使用发布-订阅(Pub/Sub)功能,可以按照以下步骤进行: 一、安装 Redis 1. 更新包列表 首先,更新本地的包列表以确保获取到最新的软件包信息: sudo apt update…...

Excel中双引号问题
背景: 从Excel中读取数据时,发现有的单元格读出来是一个双引号,有的是一个双引号 "{""accountName"": ""全字段"",""accountState"": ""NORMAL"",&q…...
【机器学习】主动学习-增加标签的操作方法-流式选择性采样(Stream-based selective sampling)
Stream-Based Selective Sampling Stream-based selective sampling 是一种主动学习方法,在处理大量数据流时特别有用。它允许学习算法动态选择是否对当前数据实例进行标注(通过与 Oracle 交互)。此方法主要应用于流数据场景中,目…...
elementUI项目中,只弹一个【token过期提示】信息框的处理
关键代码 let msgArr document.querySelectorAll(.token401Message)if (!msgArr.length) {Message({customClass: token401Message,message: response.data.msg,type: error,onClose: () > {msgArr []}})} 完整代码 import axios from axios import { getToken } from…...
SpringBoot开发—— SpringBoot中如何实现 HTTP 请求的线程隔离
文章目录 1、Servlet 容器与线程池管理1.1 线程池的作用1.2 线程池的配置 2、HTTP 请求的线程隔离2.1 请求上下文和会话信息2.2 多线程处理的隔离性 3、 ThreadLocal 和线程上下文隔离3.1ThreadLocal的使用3.2 保证线程隔离性 4、Async异步任务的线程隔离4.1 异步任务的线程池4…...
【LLM】25.1.11 Arxiv LLM论文速递
25.1.10 12:00 - 25.1.11 12:00 共更新36 篇 —第1篇---- Supervision policies can shape long-term risk management in general-purpose AI models 🔍 关键词: 通用型人工智能,风险管理,监督政策,模拟框架 PDF链接 摘要: 通…...
单片机实物成品-012 酒精监测
项目介绍 本项目以软硬件结合的方式,选择 C 语言作为程序硬件编码语言, 以 STM32 单片机作为核心控制板,在数据传输节点上连接酒精传感器对酒精浓度进行 实时检测,且对高浓度酒精采取强制干预和紧急预警,并将数据通过…...

使用葡萄城+vue实现Excel
最终实现效果如下 包含增加复选框 设置公式 设置背景颜色等,代码实在太多 有需要可留言 第一步:创建表头 请使用官网提供的网址:在线 Excel 编辑器 | SpreadJS 在线表格编辑器 1.点击下方号,创建一个新的sheet页 默认新创建的she…...

【Uniapp-Vue3】@import导入css样式及scss变量用法与static目录
一、import导入css样式 在项目文件中创建一个common文件夹,下面创建一个css文件夹,里面放上style.css文件,编写的是公共样式,我们现在要在App.vue中引入该样式。 在App.vue中引入该样式,这样就会使样式全局生效&#…...
跟我学C++中级篇——字节序
一、什么是字节序 在谈字节序前讲个小故事,在小说《格列佛游记》中,有两派势力为了吃鸡蛋的时候儿到底是先打破大的一端还是打破小的一端展开了战争,而且这场战争持续了很久。后来,1980年,Danny Cohen在论文"On …...

Linux网络编程5——多路IO转接
一.TCP状态时序理解 1.TCP状态理解 **CLOSED:**表示初始状态。 **LISTEN:**该状态表示服务器端的某个SOCKET处于监听状态,可以接受连接。 **SYN_SENT:**这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时…...
Redis常见
Redis 事务 什么是 Redis 事务? 你可以将 Redis 中的事务理解为:Redis 事务提供了一种将多个命令请求打包的功能。然后,再按顺序执行打包的所有命令,并且不会被中途打断。 Redis 事务实际开发中使用的非常少,功能比…...
提升 PHP 编码效率的 10 个实用函数
PHP开发者始终追求更简洁、高效的代码。幸运的是,PHP 提供了丰富的内置函数,能显著减少手动编码,提升开发效率。无论经验深浅,掌握这些函数的使用技巧都至关重要。 以下列出了 10 个可以显著加快您的编码过程的 PHP 函数…...

设计模式 行为型 访问者模式(Visitor Pattern)与 常见技术框架应用 解析
访问者模式(Visitor Pattern)是一种行为设计模式,它允许你在不改变元素类的前提下定义作用于这些元素的新操作。这种模式将算法与对象结构分离,使得可以独立地变化那些保存在复杂对象结构中的元素的操作。 假设我们有一个复杂的对…...

golang之数据库操作
1.导入必要的包 import("database/sql"_ "github.com/go-sql-driver/mysql" //使用此作为数据库驱动 ) 2.相关操作 连接数据库 使用sql.Open()函数进行数据库的连接 db, err : sql.Open("mysql", "user:passwordtcp(127.0.0.1:3306)/db…...

对话新晋 Apache SeaTunnel Committer:张圣航的开源之路与技术洞察
近日,张圣航被推选为 Apache SeaTunnel 的 Committer成员。带着对技术的热情和社区的责任,他将如何跟随 Apache SeaTunnel 社区迈向新的高度?让我们一起来聆听他的故事。 自我介绍 请您简单介绍一下自己,包括职业背景、当前的工作…...

Mac 删除ABC 输入法
参考链接:百度安全验证 Mac下删除系统自带输入法ABC,正解!_mac删除abc输入法-CSDN博客 ABC 输入法和搜狗输入法等 英文有冲突~~ 切换后还会在英文状态,可以删除 ;可能会对DNS 输入有影响,但是可以通过复…...

《机器学习》之K-means聚类
目录 一、简介 二、K-means聚类实现步骤 1、初始化数据点、确定K值 2、通过距离分配数据点 3、更新簇中心 4、 迭代更新 三、聚类效果评价方式 1、轮廓系数的定义 2、整体轮廓系数 3、使用场景 4、优点 5、缺点 6、代码实现方法 四、K-means聚类代码实现 1、API接…...

日常工作之 Elasticsearch 常用查询语句汇总
日常工作之 Elasticsearch 常用查询语句汇总 查询现有索引创建索引查询索引结构插入数据查询索引数据查看索引磁盘占用信息删除索引查看分词器分词结果指定查询数量指定条件查询数据迁移统计索引数据量更新数据 在使用 es 的过程中,总是会用到 es 的查询语句&#x…...

WeakAuras NES Script(lua)
WeakAuras NES Script 修星脚本字符串 脚本1:NES !WA:2!TMZFWXX1zDxVAs4siiRKiBN4eV(sTRKZ5Z6opYbhQQSoPtsxr(K8ENSJtS50(J3D7wV3UBF7E6hgmKOXdjKsgAvZFaPTtte0mD60XdCmmecDMKruyykDcplAZiGPfWtSsag6myGuOuq89EVDV9wPvKeGBM7U99EFVVVV33VFFB8Z2TJ8azYMlZj7Ur3QDR(…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...