Redis核心知識詳解:從全局命令到高級數據結構

一、Redis全局命令詳解

1.1 鍵查看與管理

  • dbsize:高效獲取鍵總數(O(1)操作)

127.0.0.1:6379> dbsize
(integer) 8
  • keys:生產環境避免使用(O(n)操作)

# 查找user開頭的鍵(不推薦生產使用)
127.0.0.1:6379> keys user:*
  • exists:檢查鍵是否存在

127.0.0.1:6379> exists user:1
(integer) 1

1.2 鍵刪除與過期

  • del:刪除單個或多個鍵

# 刪除多個鍵
127.0.0.1:6379> del user:1 user:2
(integer) 2
  • expire:設置過期時間(秒)

127.0.0.1:6379> set session:1 "data"
OK
127.0.0.1:6379> expire session:1 300
(integer) 1
  • ttl:查看剩余生存時間

127.0.0.1:6379> ttl session:1
(integer) 287  # 剩余秒數

1.3 高級過期控制

  • pexpire:毫秒級過期設置

127.0.0.1:6379> pexpire temp:key 5000
(integer) 1
  • expireat:指定時間戳過期

# 設置今晚22:00過期
127.0.0.1:6379> expireat event:1 1730000000
(integer) 1

過期時間陷阱:修改鍵值會清除過期時間

127.0.0.1:6379> set user:1 "John" ex 60
OK
127.0.0.1:6379> ttl user:1
(integer) 57
127.0.0.1:6379> set user:1 "Mike"
OK
127.0.0.1:6379> ttl user:1
(integer) -1  # 永久有效

1.4 鍵重命名注意事項

  • rename:可能覆蓋現有鍵

127.0.0.1:6379> set old_key "value1"
OK
127.0.0.1:6379> set new_key "value2"
OK
127.0.0.1:6379> rename old_key new_key
OK
127.0.0.1:6379> get new_key
"value1"  # 原值被覆蓋
  • renamenx:安全重命名(僅當新鍵不存在時)

127.0.0.1:6379> renamenx safe_key new_key
(integer) 0  # 重命名失敗

二、Redis數據類型深度解析

2.1 字符串(String)

核心命令:

# 批量操作提升性能
127.0.0.1:6379> mset counter:1 100 counter:2 200
OK# 原子計數器
127.0.0.1:6379> incr counter:1
(integer) 101# 分布式鎖實現
127.0.0.1:6379> setnx lock:order 1
(integer) 1  # 獲取鎖成功

使用場景:

  • 緩存熱點數據

  • 分布式Session存儲

  • 計數器(點擊量/瀏覽量)

  • 簡單限流系統

2.2 哈希(Hash)

對象存儲最佳實踐:

# 存儲用戶對象
127.0.0.1:6379> hmset user:1001 name "John" age 30 city "New York"
OK# 獲取部分字段
127.0.0.1:6379> hmget user:1001 name age
1) "John"
2) "30"# 字段自增
127.0.0.1:6379> hincrby user:1001 age 1
(integer) 31

vs 字符串存儲方案:

方案優點缺點
哈希存儲字段級訪問,內存效率高不支持復雜查詢
JSON序列化直觀,結構清晰讀寫需序列化,無法部分更新
多鍵存儲靈活,支持獨立過期鍵數量膨脹,管理復雜

2.3 列表(List)

實現隊列與棧:

# 消息隊列實現
# 生產者
127.0.0.1:6379> lpush msg:queue "task1"
(integer) 1# 消費者(阻塞式)
127.0.0.1:6379> brpop msg:queue 30
1) "msg:queue"
2) "task1"# 棧實現
127.0.0.1:6379> lpush stack "A"
127.0.0.1:6379> lpush stack "B"
127.0.0.1:6379> lpop stack
"B"

高級應用:

  • 文章分頁列表

  • 最近聯系人列表

  • 有限集合(LTRIM)

2.4 集合(Set)

標簽系統實現:

# 用戶標簽
127.0.0.1:6379> sadd user:1001:tags "sports" "music"
(integer) 2# 內容標簽
127.0.0.1:6379> sadd news:1001:tags "politics" "economics"# 查找共同興趣
127.0.0.1:6379> sinter user:1001:tags user:1002:tags
1) "sports"

抽獎系統:

# 參與抽獎
127.0.0.1:6379> sadd lottery:2023 "user1001" "user1002" "user1003"# 隨機抽取3名中獎者
127.0.0.1:6379> srandmember lottery:2023 3
1) "user1002"
2) "user1001"
3) "user1003"

2.5 有序集合(Zset)

排行榜實現:

# 添加玩家分數
127.0.0.1:6379> zadd leaderboard 3500 "player1"
127.0.0.1:6379> zadd leaderboard 4200 "player2"# 更新分數
127.0.0.1:6379> zincrby leaderboard 500 "player1"
"4000"# 獲取Top3
127.0.0.1:6379> zrevrange leaderboard 0 2 withscores
1) "player2"
2) "4200"
3) "player1"
4) "4000"

多維度評分:

# 計算用戶綜合評分(50%行為分+50%消費分)
127.0.0.1:6379> zinterstore user:composite 2 user:behavior_scores user:spending_scores weights 0.5 0.5 aggregate sum

三、Redis最佳實踐

3.1 鍵命名規范

推薦格式:?業務名:對象名:id[:屬性]
示例:?ecommerce:user:1001:profile

優勢:

  • 避免鍵沖突

  • 結構清晰可維護

  • 支持部分匹配查詢

3.2 性能優化要點

  1. 避免大Key:

    • 字符串值 < 10KB

    • 集合元素 < 5000

  2. 批量操作:

    # 低效方式
    for i in {1..100}; do redis-cli set key:$i value; done# 高效方式
    redis-cli mset $(printf "key:%d value " {1..100})
  3. 合理使用數據結構:

    場景推薦結構
    對象存儲Hash
    排行榜Zset
    消息隊列List
    標簽系統Set

3.3 高級特性應用

位圖(Bitmap):

# 用戶簽到系統
127.0.0.1:6379> setbit sign:user:1001 0 1  # 第1天簽到
127.0.0.1:6379> bitcount sign:user:1001    # 總簽到次數

地理空間(Geo):

# 添加位置
127.0.0.1:6379> geoadd shops 116.404 39.915 "shopA"# 查找5km內的店鋪
127.0.0.1:6379> georadius shops 116.400 39.910 5 km
1) "shopA"

四、實戰:電商場景Redis應用

4.1 購物車實現(Hash)

# 添加商品
127.0.0.1:6379> hset cart:user1001 prod1001 2
(integer) 1# 增加數量
127.0.0.1:6379> hincrby cart:user1001 prod1001 1
(integer) 3# 獲取全部商品
127.0.0.1:6379> hgetall cart:user1001
1) "prod1001"
2) "3"

4.2 秒殺系統(String+List)

# 商品庫存預熱
127.0.0.1:6379> set stock:prod2023 100# 扣減庫存(Lua腳本保證原子性)
local stock = redis.call('get', KEYS[1])
if stock and tonumber(stock) > 0 thenredis.call('decr', KEYS[1])redis.call('lpush', 'seckill:success', ARGV[1])return 1
end
return 0

4.3 好友推薦(Set)

# 計算共同好友
127.0.0.1:6379> sinter friends:user1001 friends:user1002# 推薦可能認識的人
127.0.0.1:6379> sdiff friends:user1002 friends:user1001

總結

Redis作為高性能的內存數據庫,其核心價值在于合理利用不同數據結構解決特定場景問題:

  1. 字符串:簡單緩存、計數器首選

  2. 哈希:對象存儲最佳選擇,節省內存

  3. 列表:消息隊列、最新列表實現

  4. 集合:標簽系統、社交關系處理

  5. 有序集合:排行榜、優先級隊列場景

提示:本文所有命令均在Redis 6.x版本驗證,不同版本命令支持可能略有差異。生產環境建議使用連接池管理連接,避免頻繁創建連接開銷。

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

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

相關文章

【網絡】Linux 內核優化實戰 - net.ipv4.tcp_mem

目錄 參數結構與含義與緩沖區大小參數的區別內存管理機制詳解1. 內存使用狀態與觸發邏輯2. 與其他參數的協同關系 典型調整場景與配置示例場景 1&#xff1a;高并發低帶寬服務&#xff08;如 API 網關&#xff0c;數萬連接但單連接流量小&#xff09;場景 2&#xff1a;高帶寬低…

插入排序的簡單介紹

今天給大家簡單介紹一下插入排序。 插入排序&#xff0c;其基本思想是將未排序的數據逐步插入到已排序序列中的合適位置&#xff0c;從而使整個序列逐漸有序。 下面我們看一個排序的過程&#xff08;升序&#xff09;&#xff0c;給定一個int類型的數組&#xff0c;利用插入排…

docker搭建minio和python使用minio

1 準備工作 1.創建目錄 [rootk8s-storage tmp]# mkdir -pv minio/{data,conf} mkdir: created directory ‘minio’ mkdir: created directory ‘minio/data’ mkdir: created directory ‘minio/conf’[rootk8s-storage minio]# chmod 777 -R *2.生成https證書 openssl req…

開源代碼修復新標桿——月之暗面最新開源編程模型Kimi-Dev-72B本地部署教程,自博弈修復 Bug

一、介紹 Kimi-Dev-72B是由月之暗面&#xff08;Moonshot AI&#xff09;最新開源的AI編程模型&#xff0c;專為軟件工程任務設計&#xff0c;并登頂 SWE-bench Verified 基準測試榜首&#xff0c;超越 DeepSeek-R1 等模型&#xff0c;成為當前開源代碼模型的 SOTA&#xff1a…

微服務架構之基本設計原則

作為系統架構師&#xff0c;在進行架構設計時需要遵循一系列經過實踐驗證的核心原則&#xff0c;這些原則貫穿于需求分析、模塊劃分、技術選型和系統演進的全流程。以下從核心設計原則、架構特性原則、工程實踐原則三個維度&#xff0c;結合具體案例展開說明&#xff1a; 一、…

Wpf布局之WrapPanel面板!

文章目錄 前言一、引言二、使用步驟 前言 Wpf布局之WrapPanel面板&#xff01; 一、引言 WrapPanel面板以一次一行或一列的方式布置控件&#xff01; 二、使用步驟 WrapPanel面板Orientation屬性默認是"Horizontal"&#xff0c;將控件從左向右進行排列&#xff…

QEMU運行RISCV版Ubuntu

宿主機為ubuntu20.04&#xff0c;推薦ubuntu 20.04 risc-v版&#xff0c; 宿主機為ubuntu24.04&#xff0c;推薦ubuntu 24.04 risc-v版&#xff0c; 安裝ubuntu 24.04 risc-v基本步驟&#xff1a; 1&#xff0c; sudo apt update sudo apt install opensbi qemu-system-misc…

【LeetCode 熱題 100】239. 滑動窗口最大值——(解法一)滑動窗口+暴力解

Problem: 239. 滑動窗口最大值 題目&#xff1a;給你一個整數數組 nums&#xff0c;有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。返回滑動窗口中的最大值 。 文章目錄 整體思路完整代碼時空…

攻防世界-MISC-red_green

知識點 1.pngLSB隱寫 步驟 方法一&#xff1a;zsteg 打開附件&#xff0c;是一張圖片&#xff0c;打開看不懂&#xff08;其實由兩種顏色構成&#xff0c;0和1&#xff09;&#xff0c;用zsteg查看&#xff0c;發現隱寫了一張jpg圖片&#xff0c;使用zsteg提取。打開jpg圖片…

歸因問答-如何進行自動評估

歸因模型函數g的形式化表示 輸入&#xff1a;用戶問題q 輸出&#xff1a;(a, p), 其中a為答案&#xff0c;p為原始文章中支持答案a的段落。 1&#xff09;單樣本歸因 針對輸入問題q&#xff0c;如何評估歸因模型g輸出中段落p是對答案a的正確歸因。 在論文arributed qa中&…

基于vue+View UI的組織機構選擇

1、效果 1、代碼 <template><Button type"primary" click"modal true">點擊選擇</Button><div v-if"selectedArr.length > 0"><p>已選擇項&#xff1a;</p><div v-for"(item, index) in sel…

人大金倉Kingbase數據庫KSQL 常用命令指南

人大金倉Kingbase數據庫KSQL 常用命令指南 1. 連接與基本操作 1.1 連接數據庫 # 基礎語法 ksql -U 用戶名 -d 數據庫名 -h 主機名 -p 端口號 # 示例 ksql -U system -d testdb -h 127.0.0.1 -p 543211.2 執行SQL腳本 # 基礎語法 ksql -U <用戶名> -W -f <SQL腳本文…

從萌芽到領航:廣州華銳互動的 AR 奮進之路?

在 AR 技術這片充滿無限可能的領域中&#xff0c;廣州華銳互動數字科技有限公司宛如一顆耀眼的新星&#xff0c;熠熠生輝。廣州華銳互動成立于 2008 年&#xff0c;在那個 AR 技術尚處于萌芽階段、大眾認知度還較低的時期&#xff0c;廣州華銳互動便憑借著前瞻性的戰略眼光和對…

redisson看門狗實現原理

Redisson 看門狗&#xff08;Watch Dog&#xff09;機制實現原理 Redisson 的 Watch Dog 機制是分布式鎖的核心組件之一&#xff0c;用于 自動續期 鎖的過期時間&#xff0c;防止業務邏輯執行時間超過鎖的持有時間&#xff0c;導致鎖提前釋放而引發并發問題。以下是其實現原理…

C++中explicit詳解

文章目錄 1. **防止隱式類型轉換**示例1&#xff1a;沒有使用explicit示例2&#xff1a;使用explicit 2. **防止拷貝初始化**示例1&#xff1a;沒有使用explicit示例2&#xff1a;使用explicit 3. **防止隱式類型轉換的鏈式調用**示例1&#xff1a;沒有使用explicit示例2&#…

代碼部落 20250629 CSP-J復賽 模擬賽

網址&#xff1a;代碼部落 一&#xff1a; 相濡以沫 β&#xff08;代碼請自寫&#xff09; 簽到題&#xff0c;如果a[i]<a[i1] a[i]a[i1],反之&#xff0c;直接輸出No 二 共同富裕&#xff08;代碼請自寫&#xff09; 簽到題&#xff0c;用sort前綴和 如果最富有的個…

零基礎學習RabbitMQ(5)--工作模式(1)

在前面的章節中我們簡單介紹過一些RabbitMQ的工作模式&#xff0c;RabbitMQ共提供了七種工作模式進行消息傳遞&#xff0c;這里我們來詳細介紹。 1. Simple(簡單模式) P&#xff1a;生產者 C&#xff1a;消費者 特點&#xff1a;一個生產者一個消費者&#xff0c;消息只能被…

Android Liunx ffmpeg交叉編譯

本文的交叉編譯在window上安裝VMware&#xff0c;使用Ubuntu20.4進行的編譯。 一、安裝NDK&#xff1a; 1、下載解壓&#xff1a; 在NDK 下載 | Android NDK | Android Developers下載Liunx平臺的NDK。 本人下載的是android-ndk-r27c-linux.zip版本的。 解壓android-ndk-r…

極海G32R501雙向數字電源解決方案 賦能AI服務器及電源應用創新

6月26日&#xff0c;Big-Bit商務網主辦的2025中國電子熱點解決方案創新峰會在東莞召開&#xff0c;峰會以“核心智變、能效躍遷”為主題&#xff0c;聚焦光儲充、800V超充、AI服務器、BMS、智能汽車照明與汽車中小電機電控應用。 峰會期間&#xff0c;珠海極海半導體有限公司&a…

【修電腦的小記錄】連不上網

問題概述 問題表現為&#xff1a;電腦連接網絡后&#xff0c;顯示已連接但無法上網。 環境信息&#xff1a; - DNS 修改無效&#xff0c;ping 外網&#xff08;8.8.8.8&#xff09;失敗 - 嘗試重置網絡參數、多種命令無果 &#x1f50d; 排查過程 1. 執行以下命令重置網絡&a…