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

一、鋪墊

在當今的軟件開發領域,消息隊列扮演著至關重要的角色。它能夠幫助我們實現系統的異步處理、流量削峰以及系統解耦等功能,從而提升系統的性能和可維護性。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 threadingconsumer_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 threadingconsumer_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.pswp.cn/web/75492.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75492.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75492.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java如何獲取文件的編碼格式?

Java獲取文件的編碼格式 在計算機中,文件編碼是指將文件內容轉換成二進制形式以便存儲和傳輸的過程。常見的文件編碼格式包括UTF-8、GBK等。不同的編碼使用不同的字符集和字節序列,因此在讀取文件時需要正確地確定文件的編碼格式 Java提供了多種方式以獲…

客戶端負載均衡與服務器端負載均衡詳解

客戶端負載均衡與服務器端負載均衡詳解 1. 客戶端負載均衡(Client-Side Load Balancing) 核心概念 定義:負載均衡邏輯在客戶端實現,客戶端主動選擇目標服務實例。典型場景:微服務內部調用(如Spring Cloud…

Quartus II的IP核調用及仿真測試

目錄 第一章 什么是IP核?第二章 什么是LPM?第一節 設置LPM_COUNTER模塊參數第二節 仿真 第三章 什么是PLL?第一節 設置ALTPLL(嵌入式鎖相環)模塊參數第二節 仿真 第四章 什么是RAM?第一節 RAM_1PORT的調用第…

各地物價和生活成本 東歐篇

東歐地區的物價差異相對較大,一些國家的物價較高,而另一些國家則相對便宜。這些差異主要受當地經濟發展水平、工資水平、旅游業發展以及國際關系等因素影響。以下是一些典型的東歐國家,按物價高低進行分類: 🌍 物價較高…

改進神經風格遷移

改進神經風格遷移(Neural Style Transfer, NST)可以從多個方向入手,包括模型結構優化、損失函數設計、計算效率提升、應用場景擴展等。以下是一些關鍵的改進方向及具體方法: 1. 模型結構優化 (1)輕量化網絡…

1、從零搭建魔法工坊:React 19 新手村生存指南

一、開篇:新世界的入場券 "你好,年輕的魔法學徒!歡迎來到React魔法世界。我是你的向導赫敏韋斯萊,今天我們將用React 19這根全新魔杖,搭建屬于你的第一座魔法工坊。" ——以對話形式開場,消除技…

基于 Redis 實現一套動態配置中心 DCC 服務與反射基礎知識講解

目錄 動態配置中心核心價值 輕量級 Redis 方案與 ZooKeeper 的對比分析 為什么選擇自定義 Redis 方案? 1. 技術決策背景 一、活動降級攔截 1. 定義與作用 2. 實現原理 二、活動切量攔截 1. 定義與作用 2. 實現原理 三、兩者的核心區別 四、實際應用案例 1. 電商大促…

如何從項目目標到成功標準:構建可量化、可落地的項目評估體系

引言 在項目管理領域,"項目成功"的定義往往比表面看起來更復雜。根據PMI的行業報告,67%的項目失敗源于目標與成功標準的不匹配。當項目團隊僅關注"按時交付"或"預算達標"時,常會忽視真正的價值創造。本文將通…

深度學習基礎--CNN經典網絡之分組卷積與ResNext網絡實驗探究(pytorch復現)

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 前言 ResNext是分組卷積的開始之作,這里本文將學習ResNext網絡;本文復現了ResNext50神經網絡,并用其進行了猴痘病分類實驗…

SQL 全文檢索原理

全文檢索(Full-Text Search)是SQL中用于高效搜索文本數據的技術,與傳統的LIKE操作或簡單字符串比較相比,它能提供更強大、更靈活的文本搜索能力。 基本概念 全文檢索的核心思想是將文本內容分解為可索引的單元(通常是詞或詞組),然后建立倒排…

【Linux】Orin NX編譯 linux 內核及內核模塊

1、下載交叉編譯工具:gcc 1)下載地址:https://developer.nvidia.com/embedded/jetson-linux 選擇TOOLS中的交叉編譯工具:gcc 11.3 2)解壓 將gcc編譯器解壓到指定目錄中,如:/home/laoer/nvidia/gcc 3)配置環境變量 創建: ~/nvidia/gcc/env.sh添加: #!/bin/bash e…

Transformers 是工具箱,BERT 是工具。

Transformers 是工具箱,BERT 是工具。 🔍 詳細解釋: 名稱作用比喻理解舉例🤖 transformers(庫)一個框架,提供很多 NLP 模型的“使用方式”,包括文本分類、問答、摘要等相當于一個“…

k8s之Service類型詳解

1.ClusterIP 類型 2.NodePort 類型 3.LoadBalancer 類型 4.ExternalName 類型 類型為 ExternalName 的 Service 將 Service 映射到 DNS 名稱,而不是典型的選擇算符, 例如 my-service 或者 cassandra。你可以使用 spec.externalName 參數指定這些服務…

find指令中使用正則表達式

linux查找命令能結合正則表達式嗎 find命令要使用正則表達式需要結合-regex參數 另,-type參數可以指定查找類型(f為文件,d為文件夾) rootlocalhost:~/regular_expression# ls -alh 總計 8.0K drwxr-xr-x. 5 root root 66 4月 8日 16:26 . dr-xr-…

《穿透表象,洞察分布式軟總線“無形”之奧秘》

分布式系統已成為眾多領域的關鍵支撐技術,而分布式軟總線作為實現設備高效互聯的核心技術,正逐漸走入大眾視野。它常被描述為一條“無形”的總線,這一獨特屬性不僅是理解其技術內涵的關鍵,更是把握其在未來智能世界中重要作用的切…

Ubuntu虛擬機連不上網

橋接 虛擬機Ubuntu系統必須能連接到外網,不然不能更新軟件安裝包 配置虛擬機網絡(關機或者掛起狀態) 第一步1.重啟虛擬機網絡編輯器(還原配置) 第二步2.重啟虛擬機網絡適配器(移除再添加) 啟…

rom定制系列------紅米9A批量線刷原生安卓14雙版 miui系統解鎖可登陸線刷固件

紅米9A。聯發科Helio G25芯片。該處理器支持64位運算?,但此機miui系統運行環境是32位的,這意味著盡管處理器本身支持64位計算,但miui系統限制在32位環境下運行?。官方miui系統穩定版最終為12.5.21安卓11的版本。 原生安卓14批量線刷功能固…

Matlab 分數階PID控制永磁同步電機

1、內容簡介 Matlab 203-分數階PID控制永磁同步電機 可以交流、咨詢、答疑 2、內容說明 略 3、仿真分析 略 4、參考論文 略

Flink的 RecordWriter 數據通道 詳解

本文從基礎原理到代碼層面逐步解釋 Flink 的RecordWriter 數據通道,盡量讓初學者也能理解。 1. 什么是 RecordWriter? 通俗理解 RecordWriter 是 Flink 中負責將數據從一個任務(Task)發送到下游任務的組件。想象一下,…

Dubbo、HTTP、RMI之間的區別

Dubbo、HTTP、RMI之間的區別如下: 表格 復制 特性DubboHTTPRMI通信機制基于Netty的NIO異步通信,采用長連接,支持多種序列化方式基于標準的HTTP協議,無狀態,每次請求獨立基于Java原生的RMI機制,支持Java對…