【redis】緩存設計規范

本文是 Redis 鍵值設計的 14 個核心規范與最佳實踐,按重要程度分層說明:


一、通用數據類型選擇

這里我們先給出常規的選擇路徑圖。
redis常規選擇路徑
以下是對每個步驟的分析:

  1. 是否需要排序?
    • zset(有序集合)用于排序的唯一值,而list用于排序的重復值。
  2. 數據是否唯一?
    • set用于存儲唯一的值。
  3. 是否需要存儲對象?
    • Hash適合存儲對象或具有多個字段的結構。
  4. 考慮操作頻率?
    • StringHash`都是Redis中最常用的數據類型,適用于高頻讀寫操作。
  5. 數據大小和內存占用大?
    • Bitmap適合存儲大量數據,同時占用較少的內存。
  6. 消息隊列?
    • stream是Redis用于實現消息隊列的數據類型。
  7. 原子操作和數據過期?
    • lua腳本可以用于實現原子操作,而Redis的過期機制可以用于數據過期。

二、鍵設計規范(Key Design)

  1. 命名規范

    • 格式:業務模塊:數據維度:唯一標識(例:user:profile:10001
    • 強制要求:禁止包含空格、換行符、不可見字符
    • 建議:長度控制在 100 字節以內(內存敏感場景)
  2. 大Key規避

    • 單Key值大小限制:
      • String 類型 ≤ 10KB
      • Hash/List/Set/Zset 元素數 ≤ 5000
    • 超標處理方案:
      • 數據分片(例:user:10001:cart_page1)
      • 啟用壓縮(客戶端壓縮 + LZF Redis壓縮)
  3. 過期策略

    • 必須設置過期時間(包括持久化數據,建議 30 天兜底)
    • 不同過期時間策略:
      -- 使用隨機過期時間避免批量過期導致的毛刺
      local expire_time = 86400 + math.random(0, 3600)
      redis.call('EXPIRE', KEYS[1], expire_time)
      

三、值設計規范(Value Design)

  1. 數據結構選擇原則

    • 按使用頻率選擇:
      高頻讀寫 → String/Hash
      范圍查詢 → ZSET
      去重計算 → Set/HLL
      關系查詢 → RedisGraph(需 4.0+)
      
    • 禁止將 Redis 當關系型數據庫使用(避免復雜關聯查詢)
  2. JSON序列化陷阱

    • 推薦方案:
      • 高頻字段拆解為 Hash 字段
      • 保留完整 JSON 作為 fallback 方案
    • 優化案例:
      HMSET user:10001 name "John" age 30 
      SET user:10001:full '{...}' EX 3600
      
  3. 計數器設計

    • 必須使用 INCR/DECR 代替 GET+SET
    • 集群環境推薦使用 INCRBY float 代替整數運算

三、高級優化策略

  1. 內存優化技巧

    • Hash 使用 ziplist 編碼:
      redis.conf 配置:
      hash-max-ziplist-entries 512
      hash-max-ziplist-value 64
      
    • 使用 SSCAN/ZSCAN 替代 SMEMBERS/ZRANGE
  2. 熱點Key治理

    • 檢測方法:redis-cli --hotkeys
    • 解決方案:
      • 本地緩存 + 異步刷新
      • Key 分片(例:hotkey_v1 → hotkey:{shard_id}:v1)
  3. 事務與管道

    • 管道(pipeline)批量操作控制在 100 命令/批次
    • Watch 事務中避免包含耗時操作

四、集群與持久化

  1. 集群規范

    • 單個分片內存 ≤ 10GB(AWS 內存優化型實例)
    • 跨槽操作使用 Hash Tag 需滿足:
      • 相關Key必須使用相同{}內容
      • 示例:{user10001}.orders, {user10001}.profile
  2. 持久化策略

    • AOF 配置:
      appendfsync everysec
      auto-aof-rewrite-percentage 100
      auto-aof-rewrite-min-size 64mb
      
    • RDB 快照周期 ≥ 15 分鐘

五、避坑指南

  1. 危險命令禁用

    rename-command FLUSHALL ""
    rename-command KEYS "internal_KEYS"
    
  2. 慢查詢防御

    • 設置超時閾值:
      slowlog-log-slower-than 5000 # 5ms
      
    • 定期分析:SLOWLOG GET 50
  3. 連接池配置

    // Jedis 最佳配置示例
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxTotal(500);         // 最大連接數
    config.setMaxIdle(100);          // 最大空閑連接
    config.setMinIdle(20);           // 最小空閑連接
    config.setMaxWaitMillis(2000);   // 最大等待時間
    

六、案例

以下通過 6個高頻場景的對比案例 說明 Redis 鍵值設計的核心規范,幫助直觀理解:


案例1:用戶信息存儲設計

? 錯誤做法

# 大JSON直接存儲String類型,無過期時間
SET user_10001 '{name:"John",age:30,address:"...20個字段...",lastLogin:...}'

問題

  • Key無業務含義,易沖突
  • Value超10KB違反大Key規范
  • 高頻讀取時需全量解析JSON

? 正確方案

# 模塊化Key命名 + Hash分字段存儲 + 過期時間
HMSET user:profile:10001 name "John" age 30 address "..." lastLogin 1717040000
EXPIRE user:profile:10001 2592000  # 30天過期

優化點

  • 鍵結構清晰:業務模塊:數據維度:ID
  • 高頻字段獨立存取,減少網絡傳輸
  • 兜底過期避免數據堆積

案例2:電商購物車設計

? 錯誤做法

# 用List存儲所有商品ID(可能產生大Key)
LPUSH cart:10001 "sku_123:5" "sku_456:3" ...(5000+商品)

問題

  • 超出5000元素的大Key閾值
  • 分頁查詢困難

? 正確方案

# Hash分片存儲 + 計數器
HMSET cart:10001:page1 sku_123 5 sku_456 3
HMSET cart:10001:page2 sku_789 2 ...
# 獲取商品數量(原子操作)
HINCRBY cart:10001:page1 sku_123 1 

優化點

  • 分片控制單個Key元素數量
  • 利用Hash字段的原子計數特性

案例3:秒殺庫存熱點Key

? 錯誤做法

# 集中式庫存計數器(產生熱點Key)
SET stock:sku_8888 1000
DECR stock:sku_8888  # 所有請求集中訪問此Key

問題

  • 單Key承受極高QPS
  • 集群模式下無法分散壓力

? 正確方案

# 庫存分片設計
SET stock:sku_8888:shard1 200
SET stock:sku_8888:shard2 200
...
SET stock:sku_8888:shard5 200# 客戶端隨機選擇分片扣減
DECR stock:sku_8888:shard{random(1-5)}

優化點

  • 通過分片分散熱點
  • 結合本地緩存減少Redis訪問

案例4:頁面訪問計數器

? 錯誤做法

# 非原子操作導致計數不準
count = redis.GET('page_view:home')
redis.SET('page_view:home', count+1)

問題

  • 并發場景下數據不一致
  • 頻繁GET/SET產生大量請求

? 正確方案

# 使用INCR原子操作
INCR page_view:home# 按小時滾動存儲(避免單Key過大)
INCR page_view:home:2024052715

優化點

  • 原子操作保證準確性
  • 時間分片控制Key規模

案例5:用戶消息通知列表

? 錯誤做法

# 用String存儲JSON數組(頻繁全量讀寫)
SET msg:10001 '[{id:1,content:"..."}, {...1000條數據}]'

問題

  • 大Value導致網絡阻塞
  • 修改任意消息需全量更新

? 正確方案

# 使用ZSET按時間排序存儲
ZADD msg:10001 1717040000 '{"id":1,"content":"..."}'
ZADD msg:10001 1717040001 '{"id":2,"content":"..."}'# 分頁查詢最新消息
ZREVRANGE msg:10001 0 9 WITHSCORES

優化點

  • 天然支持按時間排序和分頁
  • 單個消息的增刪不影響整體

案例6:社交關系存儲

? 錯誤做法

# 用String存儲用戶粉絲列表(大JSON數組)
SET followers:10001 "[20001,20002,...50000個用戶ID]"

問題

  • 50000個ID超過大Key限制
  • 判斷是否關注需全量掃描

? 正確方案

# 使用Set存儲關系 + 分頁控制
SADD following:10001 20001 20002 ...  # 最多5000元素/Key
SADD following:10001:page2 20003 ...  # 分片存儲# 檢查關注關系
SISMEMBER following:10001 20001

優化點

  • 分片規避大Key
  • 使用原生集合操作提升效率

總結技巧

  1. Key設計三要素:業務線明確(user)、數據類型清晰(profile)、標識唯一(10001
  2. Value選擇原則
    • 優先使用 Hash 替代 String 存儲對象
    • 需要排序用 ZSET去重用 Set隊列用 List
  3. 性能壓測公式
    # 模擬高并發場景
    redis-benchmark -h 127.0.0.1 -p 6379 -n 100000 -c 100 -t set,get
    

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

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

相關文章

2021 年 9 月青少年軟編等考 C 語言五級真題解析

目錄 T1. 問題求解思路分析T2. 抓牛思路分析T3. 交易市場思路分析T4. 泳池思路分析T1. 問題求解 給定一個正整數 N N N,求最小的 M M M 滿足比 N N N 大且 M M M 與 N N N 的二進制表示中有相同數目的 1 1 1。 舉個例子,假如給定 N N N 為 78 78 78,二進制表示為 …

Windows 中學習Docker環境準備2、Docker Desktop中安裝ubuntu

Windows 中學習Docker環境準備1、Win11安裝Docker Desktop Windows 中學習Docker環境準備2、Docker Desktop中安裝ubuntu Windows 中學習Docker環境準備3、在Ubuntu中安裝Docker 需要更多Docker學習視頻和資料,請文末聯系 一、安裝 Docker Desktop 下載 Docker…

LabVIEW2025中文版軟件安裝包、工具包、安裝教程下載

下載鏈接:LabVIEW及工具包大全-三易電子工作室http://blog.eeecontrol.com/labview6666 《LabVIEW2025安裝圖文教程》 1、解壓后,雙擊install.exe安裝 2、選中“我接受上述2條許可協議”,點擊下一步 3、點擊下一步,安裝NI Packa…

PHP ODBC:深入探索數據庫連接與交互技術

PHP ODBC:深入探索數據庫連接與交互技術 引言 PHP作為一種廣泛使用的服務器端腳本語言,在Web開發中扮演著重要角色。在數據處理方面,PHP與數據庫的交互是其核心功能之一。ODBC(Open Database Connectivity)作為一種標準數據庫訪問接口,允許PHP應用程序與各種數據庫系統…

AUTOSAR汽車電子嵌入式編程精講300篇-基于FPGA的CAN FD汽車總線數據交互系統設計

目錄 前言 汽車總線以及發展趨勢 汽車總線技術 汽車總線發展趨勢 CAN FD總線國內外研究現狀 2 系統方案及CAN FD協議分析 2.1系統控制方案設計 2.2 CAN FD總線幀結構分析 2.2.1數據幀分析 2.2.2遠程幀分析 2.2.3過載幀分析 2.2.4錯誤幀分析 2.2.5幀間隔分析 2.3位…

BUU17 [RoarCTF 2019]Easy Calc1

自用 源代碼 $(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div class"alert alert-success"><strong>答案:&l…

5. k8s二進制集群之ETCD集群部署

下載etcd安裝包創建etcd配置文件準備證書文件和etcd存儲目錄ETCD證書文件安裝(分別對應指定節點)創建證書服務的配置文件啟動etcd集群驗證etcd集群狀態繼續上一篇文章《k8s二進制集群之ETCD集群證書生成》下面介紹一下etcd證書生成配置。 下載etcd安裝包 https://github.com…

Java并發編程筆記

Java并發基礎知識補全 啟動 啟動線程的方式只有&#xff1a; 1、X extends Thread;&#xff0c;然后X.start 2、X implements Runnable&#xff1b;然后交給Thread運行 線程的狀態 Java中線程的狀態分為6種&#xff1a; 1. 初始(NEW)&#xff1a;新創建了一個線程對象&…

使用多模態大語言模型進行深度學習的圖像、文本和語音數據增強

在過去的五年里&#xff0c;研究方向已從傳統的機器學習&#xff08;ML&#xff09;和深度學習&#xff08;DL&#xff09;方法轉向利用大語言模型&#xff08;LLMs&#xff09;&#xff0c;包括多模態方法&#xff0c;用于數據增強&#xff0c;以提高泛化能力&#xff0c;并在…

Windows Docker筆記-Docker拉取鏡像

通過在前面的章節《安裝docker》中&#xff0c;了解并安裝成功了Docker&#xff0c;本章講述如何使用Docker拉取鏡像。 使用Docker&#xff0c;主要是想要創建并運行Docker容器&#xff0c;而容器又要根據Docker鏡像來創建&#xff0c;那么首當其沖&#xff0c;必須要先有一個…

YOLOv11-ultralytics-8.3.67部分代碼閱讀筆記-autobatch.py

autobatch.py ultralytics\utils\autobatch.py 目錄 autobatch.py 1.所需的庫和模塊 2.def check_train_batch_size(model, imgsz640, ampTrue, batch-1, max_num_obj1): 3.def autobatch(model, imgsz640, fraction0.60, batch_sizeDEFAULT_CFG.batch, max_num_obj1): …

【文件上傳、秒傳、分片上傳、斷點續傳、重傳】

文章目錄 獲取文件對象文件上傳&#xff08;秒傳、分片上傳、斷點續傳、重傳&#xff09;優化 獲取文件對象 input標簽的onchange方法接收到的參數就是用戶上傳的所有文件 <html lang"en"><head><title>文件上傳</title><style>#inp…

Office/WPS接入DS等多個AI工具,開啟辦公新模式!

在現代職場中&#xff0c;Office辦公套件已成為工作和學習的必備工具&#xff0c;其功能強大但復雜&#xff0c;熟練掌握需要系統的學習。為了簡化操作&#xff0c;使每個人都能輕松使用各種功能&#xff0c;市場上涌現出各類辦公插件。這些插件不僅提升了用戶體驗&#xff0c;…

FPGA的IP核接口引腳含義-快解

疑問 手冊繁瑣&#xff0c;怎樣快速了解IP核各輸入輸出接口引腳的含義。 答疑 不慌不慌&#xff0c;手冊確實比較詳細但繁瑣&#xff0c;如何快速知曉該部分信息&#xff0c;濤tao道長給你們說&#xff0c;簡單得很&#xff0c;一般新入門的道友有所不知&#xff0c;往往后面…

GnuTLS: 在 pull 函數中出錯。 無法建立 SSL 連接。

提示信息 [root@localhost ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-27.5.1.tgz --2025-02-06 12:45:34-- https://download.docker.com/linux/static/stable/x86_64/docker-27.5.1.tgz 正在解析主機 download.docker.com (download.docker.…

Python3+Request+Pytest+Allure+Jenkins 接口自動化測試[手動寫的和AI寫的對比]

我手動寫的參考 總篇:Python3+Request+Pytest+Allure+Jenkins接口自動化框架設計思路_jenkins python3+request-CSDN博客 https://blog.csdn.net/fen_fen/article/details/144269072 下面是AI寫的:Python3+Request+Pytest+Allure+Jenkins 接口自動化測試[AI文章框架] 在軟…

告別手動操作!用Ansible user模塊高效管理 Linux賬戶

在企業運維環境中&#xff0c;服務器的用戶管理是一項基礎但非常重要的任務。比如&#xff0c;當有新員工加入時&#xff0c;我們需要在多臺服務器上為他們創建賬戶并分配合適的權限。而當員工離職或崗位發生變化時&#xff0c;我們也需要迅速禁用或刪除他們的賬戶&#xff0c;…

ADC模數轉換器概念函數及應用

ADC模數轉換器概念函數及應用 文章目錄 ADC模數轉換器概念函數及應用1.ADC簡介2.逐次逼近型ADC2.1逐次逼近型ADC2.2stm32逐次逼近型2.3ADC基本結構2.4十六個通道 3.規則組的4種轉換模式3.1單次轉換&#xff0c;非掃描模式3.2連續轉換&#xff0c;非掃描模式3.3單次轉換&#xf…

探索前端框架的未來:Svelte 的崛起

引言 在前端開發的世界里&#xff0c;框架更新換代的速度仿佛光速。從 jQuery 到 Angular&#xff0c;再到如今大熱的 React 和 Vue&#xff0c;開發者們不斷追逐更輕量、更快、更易于維護的框架。如今&#xff0c;Svelte 正悄然崛起&#xff0c;并引發了關于前端框架未來的熱烈…

DeepSeek在FPGA/IC開發中的創新應用與未來潛力

隨著人工智能技術的飛速發展&#xff0c;以DeepSeek為代表的大語言模型&#xff08;LLM&#xff09;正在逐步滲透到傳統硬件開發領域。在FPGA&#xff08;現場可編程門陣列&#xff09;和IC&#xff08;集成電路&#xff09;開發這一技術密集型行業中&#xff0c;DeepSeek憑借其…