【高性能缓存Redis_中间件】一、快速上手redis缓存中间件

news2025/4/14 16:59:13

一、铺垫

在当今的软件开发领域,消息队列扮演着至关重要的角色。它能够帮助我们实现系统的异步处理、流量削峰以及系统解耦等功能,从而提升系统的性能和可维护性。Redis 作为一款高性能的键值对数据库,不仅提供了丰富的数据结构,还具备实现消息队列的能力。本篇文章将带您入门 Redis 消息队列,介绍其基础概念,并通过简单的实践让您初步掌握其使用方法。

二、消息队列概述

2.1 消息队列的基本概念

消息队列(Message Queue)是一种在不同组件或进程之间传递消息的机制。它遵循 “生产者 - 消费者” 模型,生产者负责将消息发送到队列中,而消费者则从队列中获取消息并进行处理。这种模型使得生产者和消费者可以独立工作,不需要直接交互,从而实现了系统的解耦。

2.2 消息队列的应用场景

  • 异步处理:当一个业务流程包含多个步骤,且某些步骤不需要立即完成时,可以将这些步骤封装成消息发送到队列中,由消费者异步处理。例如,用户注册时发送注册成功邮件的操作就可以异步进行。
  • 流量削峰:在高并发场景下,消息队列可以作为缓冲,将大量的请求暂时存储在队列中,然后由消费者按照一定的速率进行处理,避免系统因瞬间的高流量而崩溃。例如,电商平台的秒杀活动。
  • 系统解耦:不同的系统组件可以通过消息队列进行通信,一个组件的变化不会直接影响到其他组件。例如,订单系统和库存系统之间可以通过消息队列传递订单信息,而不需要直接调用对方的接口。

三、Redis 消息队列简介

3.1 Redis 作为消息队列的优势

  • 高性能:Redis 基于内存存储数据,读写速度极快,能够满足高并发场景下的消息处理需求。
  • 数据结构丰富:Redis 提供了多种数据结构,如列表(List)、集合(Set)、有序集合(Sorted Set)等,这些数据结构可以方便地实现不同类型的消息队列。
  • 简单易用:Redis 的 API 简单易懂,开发人员可以快速上手,并且 Redis 支持多种编程语言,方便与不同的系统集成。

3.2 Redis 消息队列与其他消息队列的对比

与其他常见的消息队列(如 RabbitMQ、Kafka)相比,Redis 消息队列具有以下特点:

  • 功能相对简单:Redis 消息队列主要侧重于简单的消息传递,对于一些复杂的功能(如消息持久化、事务处理等)支持不如 RabbitMQ 和 Kafka 完善。
  • 性能优势明显:由于 Redis 基于内存操作,在处理小消息和高并发场景下,性能优于 RabbitMQ 和 Kafka。
  • 使用场景不同:Redis 消息队列适用于对性能要求较高、消息处理逻辑相对简单的场景;而 RabbitMQ 和 Kafka 则更适合处理复杂的消息流和大规模数据的场景。

四、Redis 安装与配置

4.1 Redis 安装

以下以在 Linux 系统上安装 Redis 为例进行说明:

# 下载 Redis 源码
wget http://download.redis.io/releases/redis-6.2.6.tar.gz
# 解压文件
tar xzf redis-6.2.6.tar.gz
# 进入解压后的目录
cd redis-6.2.6
# 编译 Redis
make
# 安装 Redis
make install

4.2 Redis 配置

Redis 的配置文件位于 redis.conf,可以根据需要进行修改。以下是一些常用的配置项:

# 监听的端口
port 6379
# 绑定的 IP 地址
bind 127.0.0.1
# 是否以守护进程方式运行
daemonize yes
# 密码认证
requirepass yourpassword

修改完配置文件后,启动 Redis 服务:

redis-server /path/to/redis.conf

五、Redis 消息队列的基本使用

5.1 发布 - 订阅模式(Pub/Sub)

发布 - 订阅模式是 Redis 消息队列的一种常用模式。在这种模式下,生产者将消息发布到一个或多个频道(Channel),而消费者则订阅这些频道,当有新消息发布到频道时,订阅该频道的所有消费者都会收到消息。

import redis

# 连接 Redis
r = redis.Redis(host='localhost', port=6379, password='yourpassword')

# 生产者:发布消息
def publish_message(channel, message):
    r.publish(channel, message)
    print(f"消息 '{message}' 已发布到频道 '{channel}'")

# 消费者:订阅频道
def subscribe_channel(channel):
    pubsub = r.pubsub()
    pubsub.subscribe(channel)
    for item in pubsub.listen():
        if item['type'] == 'message':
            print(f"收到来自频道 '{channel}' 的消息: {item['data'].decode('utf-8')}")

if __name__ == "__main__":
    # 启动消费者线程
    import threading
    consumer_thread = threading.Thread(target=subscribe_channel, args=('test_channel',))
    consumer_thread.start()

    # 生产者发布消息
    publish_message('test_channel', 'Hello, Redis Pub/Sub!')

解释

  • redis.Redis:用于连接 Redis 服务器。
  • r.publish:将消息发布到指定的频道。
  • r.pubsub():创建一个发布 - 订阅对象。
  • pubsub.subscribe:订阅指定的频道。
  • pubsub.listen():监听频道的消息,返回一个迭代器。

5.2 列表模式(List)

列表模式是 Redis 消息队列的另一种常用模式。在这种模式下,生产者将消息添加到列表的一端(通常是右端),而消费者则从列表的另一端(通常是左端)获取消息。这种模式可以实现消息的先进先出(FIFO)顺序。

import redis
import time

# 连接 Redis
r = redis.Redis(host='localhost', port=6379, password='yourpassword')

# 生产者:添加消息到列表
def add_message_to_list(list_name, message):
    r.rpush(list_name, message)
    print(f"消息 '{message}' 已添加到列表 '{list_name}'")

# 消费者:从列表中获取消息
def get_message_from_list(list_name):
    while True:
        message = r.lpop(list_name)
        if message:
            print(f"从列表 '{list_name}' 中获取到消息: {message.decode('utf-8')}")
        else:
            time.sleep(1)  # 如果列表为空,等待 1 秒后再尝试

if __name__ == "__main__":
    # 启动消费者线程
    import threading
    consumer_thread = threading.Thread(target=get_message_from_list, args=('test_list',))
    consumer_thread.start()

    # 生产者添加消息
    add_message_to_list('test_list', 'Hello, Redis List!')

 解释

  • r.rpush:将消息添加到列表的右端。
  • r.lpop:从列表的左端获取并移除一个消息。

六、实践案例

6.1 实时日志收集

在一个大型的分布式系统中,各个服务会产生大量的日志信息。为了方便对这些日志进行集中管理和分析,可以使用 Redis 消息队列实现实时日志收集。具体实现步骤如下:

  1. 日志生产者:各个服务将产生的日志信息作为消息发送到 Redis 消息队列的指定频道或列表中。
  2. 日志消费者:日志收集系统从 Redis 消息队列中获取日志消息,并将其存储到日志存储系统(如 Elasticsearch)中。

6.2 简单的任务调度

在一个简单的任务调度系统中,可以使用 Redis 消息队列来管理任务。具体实现步骤如下:

  1. 任务生产者:将需要执行的任务信息作为消息发送到 Redis 消息队列的列表中。
  2. 任务消费者:任务执行系统从 Redis 消息队列中获取任务消息,并执行相应的任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI Agent入门指南

图片来源网络 ‌一、开箱暴击:你以为的"智障音箱",其实是赛博世界的007‌ ‌1.1 从人工智障到智能叛逃:Agent进化史堪比《甄嬛传》‌ ‌青铜时代(2006-2015)‌ “小娜同学,关灯” “抱歉&…

海洋大地测量基准与水下导航系列之八我国海洋水下定位装备发展现状

中国国家综合PNT体系建设重点可概括为“51N”,“5”指5大基础设施,包括重点推进下一代北斗卫星导航系统、积极发展低轨导航增强系统、按需发展水下导航系统、大力发展惯性导航系统、积极探索脉冲星导航系统;“1”是实现1个融合发展&#xff0…

谷歌开源代理开发工具包(Agent Development Kit,ADK):让多智能体应用的构建变得更简

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

noscript 标签是干什么的

vue public目录下的 index.html 会有 <noscript> 标签不知道是干吗的。 其实 noscript 标签在不支持或是禁用JavaScript 的浏览器中显示替代的内容。这个元素可以包含任何 HTML 元素。这个标签的用法也非常简单&#xff1a; <noscript><strong>Were sorry …

[创业之路-366]:投资尽职调查 - 尽调核心逻辑与核心影响因素:价值、估值、退出、风险、策略

目录 一、VC投资的本质是冒着不确定性风险进行买卖、生意&#xff0c;为了赚取高额回报 1、VC投资的核心本质 2、VC投资的运作机制 3、VC投资的风险与挑战 4、VC投资的底层逻辑 5、总结&#xff1a;VC投资的本质再定义 二、尽调核心逻辑 1、尽调的含义 2、尽调的逻辑方…

Hyprnote开源程序是一款记录和转录您会议的 AI 记事本。 本地优先且可扩展 。

一、软件介绍 文末提供源码下载学习 Hyprnote开源程序是一款记录和转录您会议的 AI 记事本。 从您的原始会议记录中生成强大的摘要&#xff0c;本地优先且可扩展 。使用开源模型 &#xff08;Whisper & Llama&#xff09; 离线工作&#xff0c;高度可扩展 &#xff0c;由插…

上篇:新能源轻卡城配物流经济/动力模式量化定义(理论篇)——数学暴力破解工程困局

副标题&#xff1a;用微分方程撕开模式切换本质&#xff0c;用传感器数据重构载重真相 引言&#xff1a;为什么轻卡模式定义比乘用车难10倍&#xff1f; 行业现状痛点&#xff1a; 中国新能源轻卡日均载重波动高达300%&#xff08;空载0kg→满载4.5吨&#xff09;某头部车企实…

Ubuntu22环境下,Docker部署阿里FunASR的gpu版本

番外: 随着deepseek的爆火,人工智能相关的开发变得异常火爆,相关的大模型开发很常见的agent智能体需要ASR语音识别的功能,阿里开源的FunASR几乎是把一个商业的项目放给我们使用了。那么我们项目中的生产环境怎么部署gpu版本的语音识别服务呢?经过跟deepseek的一上午的极限…

内网邮箱服务器搭建-详解

目录 一、背景 二、搭建邮箱需要具备的基础知识 1、smtp&#xff08;Simple Mail Transfer Protocol&#xff09; SMTP工作原理 SMTP 命令 SMTP 协议端口 2、pop3&#xff08;Post Office Protocol&#xff09; POP3特点 POP3工作原理 3、imap4&#xff08;Internet M…

使用 LLaMA-Factory 微调 llama3 模型(二)

使用 LLaMA-Factory 微调 llama3 模型 1. LLaMA-Factory模型介绍 https://github.com/hiyouga/LLaMA-FactoryLLaMA-Factory 是一个用于大型语言模型&#xff08;LLM&#xff09;微调的工具&#xff0c;它旨在简化大型语言模型的微调过程&#xff0c; 使得用户可以快速地对模型…

并发编程--条件量与死锁及其解决方案

并发编程–条件量与死锁及其解决方案 文章目录 并发编程--条件量与死锁及其解决方案1.条件量1.1条件量基本概念1.2条件量的使用 2. 死锁 1.条件量 1.1条件量基本概念 在许多场合中&#xff0c;程序的执行通常需要满足一定的条件&#xff0c;条件不成熟的时候&#xff0c;任务…

JAVA SE 自我总结

目录 1. 字面常量 2. 数据类型 3. 变量 4. 类型转换 5. 实参和形参的关系 6. 数组 6.1 数组的概念 6.2 动态初始化 6.3 静态初始化 7. 数据区 ​编辑 8. 数组的拷贝 8.1 赋值拷贝 8.2 方法拷贝 9. 代码块 10. 内部类 10.1 实例内部类 10.2 静态内部类 10.3 …

RAG创建向量数据库:docsearch = FAISS.from_texts(documents, embeddings)

RAG创建向量数据库:docsearch = FAISS.from_texts(documents, embeddings) 代码解释 docsearch = FAISS.from_texts(documents, embeddings) 这行代码主要作用是基于给定的文本集合创建一个向量数据库(这里使用 FAISS 作为向量数据库工具 )。具体说明如下: FAISS :FAISS …

虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解?

虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解&#xff1f; code review! 文章目录 虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解&#xff1f;理解这句话的关键点1.类&#xff08…

鸢尾花分类的6种机器学习方法综合分析与实现

鸢尾花分类的6种机器学习方法综合分析与实现 首先我们来看一下对应的实验结果。 数据准备与环境配置 在开始机器学习项目前&#xff0c;首先需要准备编程环境和加载数据。以下代码导入必要的库并加载鸢尾花数据集&#xff1a; import numpy as np import pandas as pd impo…

vite,Vue3,ts项目关于axios配置

一、安装依赖包 npm install axios -S npm install qs -S npm install js-cookie 文件目录 二、配置线上、本地环境 与src文件同级,分别创建本地环境文件 .env.development 和线上环境文件 .env.production # 本地环境 ENV = development # 本地环境接口地址 VITE_API_URL =…

STM32 模块化开发指南 · 第 4 篇 用状态机管理 BLE 应用逻辑:分层解耦的实践方式

本文是《STM32 模块化开发实战指南》第 4 篇,聚焦于 BLE 模块中的状态管理问题。我们将介绍如何通过有限状态机(Finite State Machine, FSM)架构,实现 BLE 广播、扫描、连接等行为的解耦与可控,并配合事件队列驱动完成主从共存、低功耗友好、状态清晰的 BLE 应用。 一、为…

HTML — 浮动

浮动 HTML浮动&#xff08;Float&#xff09;是一种CSS布局技术&#xff0c;通过float: left或float: right使元素脱离常规文档流并向左/右对齐&#xff0c;常用于图文混排或横向排列内容。浮动元素会紧贴父容器或相邻浮动元素的边缘&#xff0c;但脱离文档流后可能导致父容器高…

IP节点详解及国内IP节点获取指南

获取国内IP节点通常涉及网络技术或数据资源的使用&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;对于网络连接和通信至关重要。详细介绍几种修改网络IP地址的常用方法&#xff0c;无论是对于家庭用户还是企业用户&#xff0c;希望能找到适合自己的解决方案。以下是方法…

AD9253 LVDS 高速ADC驱动开发

1、查阅AD9253器件手册 2、查阅Xilinx xapp524手册 3、该款ADC工作在125Msps下&#xff0c;14bit - 2Lane - 1frame 模式。 对应&#xff1a;data clock时钟为500M DDR mode。data line rate&#xff1a;1Gbps。frame clock&#xff1a;1/4 data clock 具体内容&#xff1a;…