Redis除了做緩存還能做什么?

Redis 除了作為高性能緩存外,還因其豐富的數據結構和功能,廣泛應用于多種場景。以下是 Redis 的十大核心用途及具體示例:


1. 分布式會話存儲

  • 用途:存儲用戶會話信息(如登錄狀態),實現多服務間共享會話。
  • 優勢:避免傳統 Session 存儲在單點故障或擴展性問題。
  • 數據結構:Hash(存儲會話字段)、String(簡單鍵值)。
  • 示例
    # 存儲用戶會話
    HSET user:session:1234 username "john" role "admin" expires 3600
    # 獲取會話信息
    HGETALL user:session:1234
    

2. 分布式鎖

  • 用途:實現跨服務的互斥鎖,防止并發操作導致的數據不一致。
  • 核心命令SET key value NX PX 30000(原子操作 + 超時)。
  • 示例(防止重復下單):
    # 嘗試獲取鎖(存在則失敗)
    SET order_lock:1001 "locked" NX PX 10000
    # 釋放鎖(需結合Lua腳本保證原子性)
    if redis.call("get", KEYS[1]) == ARGV[1] thenreturn redis.call("del", KEYS[1])
    elsereturn 0
    end
    

3. 消息隊列

  • 用途:實現輕量級消息隊列,支持異步任務處理。
  • 數據結構:List(LPUSH/RPOP)、Stream(支持消費者組)。
  • 示例(使用 List):
    # 生產者推送任務
    LPUSH task_queue "send_email:user1@example.com"
    # 消費者獲取任務
    RPOP task_queue
    

4. 實時排行榜

  • 用途:實時更新和查詢排行榜(如游戲積分、商品銷量)。
  • 數據結構:Sorted Set(按分數排序)。
  • 示例(游戲積分排行榜):
    # 添加玩家積分
    ZADD game_leaderboard 1500 "player1" 2000 "player2" 1800 "player3"
    # 獲取前10名
    ZREVRANGE game_leaderboard 0 9 WITHSCORES
    

5. 計數器與限流

  • 用途:統計訪問量、點贊數,或限制接口請求頻率。
  • 核心命令INCRINCRBYEXPIRE
  • 示例(接口限流:每分鐘最多100次請求):
    # 每次請求遞增計數器
    INCR api_rate_limit:user123
    # 設置過期時間(首次設置時)
    EXPIRE api_rate_limit:user123 60
    # 檢查是否超限
    GET api_rate_limit:user123  # 超過100則拒絕
    

6. 發布/訂閱(Pub/Sub)

  • 用途:實現消息廣播,支持實時通知(如聊天室、實時數據推送)。
  • 核心命令PUBLISHSUBSCRIBE
  • 示例(實時新聞推送):
    # 訂閱頻道
    SUBSCRIBE news_channel
    # 發布消息
    PUBLISH news_channel "Breaking: Redis 7.0 released!"
    

7. 地理位置服務

  • 用途:存儲和查詢地理位置(如附近的人、商家)。
  • 數據結構:GEO(基于 Sorted Set 實現)。
  • 示例(查找附近的餐廳):
    # 添加地理位置
    GEOADD restaurants 116.404269 39.913818 "restaurant_A"
    GEOADD restaurants 116.407531 39.915264 "restaurant_B"
    # 查找2公里內的餐廳
    GEORADIUS restaurants 116.405285 39.912987 2 km WITHDIST
    

8. 布隆過濾器(Bloom Filter)

  • 用途:高效判斷元素是否存在(如防止緩存穿透、去重)。
  • 原理:基于概率的數據結構,占用空間極小。
  • 示例(校驗新用戶是否已注冊):
    # 添加元素
    BF.ADD users "user123"
    # 檢查是否存在
    BF.EXISTS users "user123"  # 返回1(可能存在)或0(一定不存在)
    

9. 實時數據分析

  • 用途:統計在線用戶數、實時點擊量等。
  • 數據結構:HyperLogLog(去重計數)、Bitmap(位操作)。
  • 示例(統計每日活躍用戶):
    # 記錄用戶訪問(用戶ID為整型)
    SETBIT daily_active:20231001 1001 1
    # 統計總活躍用戶數
    BITCOUNT daily_active:20231001
    

10. 數據庫與緩存的二級存儲

  • 用途:作為 MySQL 的二級存儲,緩存復雜查詢結果。
  • 模式:先查 Redis,未命中則查數據庫并回填。
  • 示例(緩存商品詳情):
    # 查詢商品信息
    GET product:detail:1001
    # 未命中時從數據庫加載并寫入Redis
    SET product:detail:1001 '{"id":1001,"name":"Phone"}' EX 3600
    

總結

Redis 的多樣化應用得益于其 高性能豐富的數據結構原子操作。合理使用 Redis 可以顯著提升系統性能,解決分布式場景下的復雜問題。根據具體需求選擇合適的數據結構和功能,是最大化 Redis 價值的關鍵。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70961.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70961.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70961.shtml

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

相關文章

JBoltAI_SpringBoot如何區分DeepSeek R1深度思考和具體回答的內容(基于Ollama)?

當我們用Ollama運行DeepSeek R1模型,向它提問時,會發現它的回答里是有think標簽的 如果我們直接將Ollama的回復用于生產環境,肯定是不行的,對于不同的場景,前面輸出的一堆內容,可能并不需要在客戶端展示&a…

MySQL 使用 `WHERE` 子句時 `COUNT(*)`、`COUNT(1)` 和 `COUNT(column)` 的區別解析

文章目錄 1. COUNT() 函數的基本作用2. COUNT(*)、COUNT(1) 和 COUNT(column) 的詳細對比2.1 COUNT(*) —— 統計所有符合條件的行2.2 COUNT(1) —— 統計所有符合條件的行2.3 COUNT(column) —— 統計某一列非 NULL 的記錄數 3. 性能對比3.1 EXPLAIN 分析 4. 哪種方式更好&…

將DeepSeek接入vscode的N種方法

接入deepseek方法一:cline 步驟1:安裝 Visual Studio Code 后,左側導航欄上點擊擴展。 步驟2:搜索 cline,找到插件后點擊安裝。 步驟3:在大模型下拉菜單中找到deep seek,然后下面的輸入框輸入你在deepseek申請的api key,就可以用了 讓deepseek給我寫了一首關于天氣的…

AndroidManifest.xml文件的作用

AndroidManifest.xml文件在Android應用程序中扮演著至關重要的角色。它是應用程序的全局配置文件,提供了關于應用程序的所有必要信息,這些信息對于Android系統來說是至關重要的,因為它決定了應用程序的運行方式和權限要求,確保了應…

Mac本地部署Deep Seek R1

Mac本地部署Deep Seek R1 1.安裝本地部署大型語言模型的工具 ollama 官網:https://ollama.com/ 2.下載Deepseek R1模型 網址:https://ollama.com/library/deepseek-r1 根據電腦配置,選擇模型。 我的電腦:Mac M3 24G內存。 這…

React進階之前端業務Hooks庫(五)

前端業務Hooks庫 Hooks原理useStateuseEffect上述問題useState,useEffect 復用的能力練習:怎樣實現一套React過程中的hooks狀態 & 副作用Hooks原理 不能在循環中、條件判斷、子函數中調用,只能在函數最外層去調用useEffect 中,deps 為空,執行一次useState 使用: imp…

從像素到光線:現代Shader開發的范式演進與性能優化實踐

引言 在實時圖形渲染領域,Shader作為GPU程序的核心載體,其開發范式已從早期的固定功能管線演進為高度可編程的計算單元。本文通過解析關鍵技術案例,結合現代圖形API(如Vulkan、Metal)的特性,深入探討Shade…

(七)消息隊列-Kafka 序列化avro(傳遞)

(七)消息隊列-Kafka 序列化avro(傳遞) 客從遠方來,遺我雙鯉魚。呼兒烹鯉魚,中有尺素書。 ——佚名《飲馬長城窟行》 本文已同步CSDN、掘金平臺、知乎等多個平臺,圖片依然保持最初發布的水印&…

PXE批量網絡裝機與Kickstart自動化安裝工具

目錄 一、系統裝機的原理 1.1、系統裝機方式 1.2、系統安裝過程 二、PXE批量網絡裝機 2.1、PXE實現原理 2.2、搭建PXE實際案例 2.2.1、安裝必要軟件 2.2.2、搭建DHCP服務器 2.2.3、搭建TFTP服務器 2.2.4、掛載鏡像并拷貝引導文件到tftp服務啟動引導文件夾下 2.2.5、編…

【全棧開發】從0開始搭建一個圖書管理系統【一】框架搭建

【全棧開發】從0開始搭建一個圖書管理系統【一】框架搭建 前言 現在流行降本增笑,也就是不但每個人都要有事干不能閑著,更重要的是每個人都要通過報功的方式做到平日的各項工作異常飽和,實現1.5人的支出干2人的活計。單純的數據庫開發【膚淺…

部署Flink1.20.1

1、設置環境變量 export JAVA_HOME/cluster/jdk export CLASSPATH.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarp #export HIVE_HOME/cluster/hive export MYSQL_HOME/cluster/mysql export HADOOP_HOME/cluster/hadoop3 export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop …

【超詳細】神經網絡的可視化解釋

《------往期經典推薦------》 一、AI應用軟件開發實戰專欄【鏈接】 項目名稱項目名稱1.【人臉識別與管理系統開發】2.【車牌識別與自動收費管理系統開發】3.【手勢識別系統開發】4.【人臉面部活體檢測系統開發】5.【圖片風格快速遷移軟件開發】6.【人臉表表情識別系統】7.【…

深入了解 Python 中的 MRO(方法解析順序)

文章目錄 深入了解 Python 中的 MRO(方法解析順序)什么是 MRO?如何計算 MRO?C3 算法的合并規則C3 算法的合并步驟示例:合并過程解析 MRO 解析失敗的場景使用 mro() 方法查看 MRO示例 1:基本用法 菱形繼承與…

數字化賦能:制造業如何突破低效生產的瓶頸?

隨著全球經濟的快速發展與市場需求的變化,制造業面臨著前所未有的壓力與挑戰。生產效率、資源管理、品質控制、成本控制等方面的問題日益突出,尤其是低效生產成為了許多制造企業亟待解決的瓶頸。在這種背景下,數字化轉型成為提升制造業效率的…

Element-Plus,使用 El-form中 的 scroll-to-error 沒有效果問題記錄

因業務需要表單組件中嵌套著表格列表,內容比較多; 所以需要表單校驗不通過時,自動定位到不通過的節點; 但發現這個像是沒有起到效果一樣,后面就是排查的思路了: 容器高度問題:如果表單容器的高度…

基于Javase的停車場收費管理系統

基于Javase的停車場收費管理系統 停車場管理系統開發文檔 項目概述 1.1 項目背景 隨著現代化城市的不斷發展,車輛數量不斷增加,停車難問題也日益突出。為了更好地管理停車場資 源,提升停車效率,需要一個基于Java SE的停車場管理…

網絡協議 HTTP、HTTPS、HTTP/1.1、HTTP/2 對比分析

1. 基本定義 HTTP(HyperText Transfer Protocol) 應用層協議,用于客戶端與服務器之間的數據傳輸(默認端口 80)。 HTTP/1.0:早期版本,每個請求需單獨建立 TCP 連接,效率低。HTTP/1.1&…

DeepSeek掘金——調用DeepSeek API接口 實現智能數據挖掘與分析

調用DeepSeek API接口:實現智能數據挖掘與分析 在當今數據驅動的時代,企業和開發者越來越依賴高效的數據挖掘與分析工具來獲取有價值的洞察。DeepSeek作為一款先進的智能數據挖掘平臺,提供了強大的API接口,幫助用戶輕松集成其功能到自己的應用中。本文將詳細介紹如何調用D…

LabVIEW同步數據采集功能

VI通過使用數據采集(DAQ)硬件系統,進行多通道同步采集,實時獲取模擬信號數據。它利用外部時鐘信號觸發數據采集,支持連續采樣模式,并將采集到的數據實時顯示在波形圖上,方便用戶進行數據監控和分…

SpringDataJPA使用deleteAllInBatch方法邏輯刪除失效

概述 在使用Spring Boot JPA時,執行批量刪除操作時,遇到邏輯刪除失效的問題。具體而言,當使用deleteAllInBatch方法時,數據會被物理刪除,而不是進行邏輯刪除;但是當使用deleteAll時,邏輯刪除操…