在 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(…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...