RedisJSON 技術揭秘`JSON.ARRTRIM`用窗口裁剪,讓數組保持“剛剛好”

1、指令速查

JSON.ARRTRIM <key> <path> <start> <stop>
  • key:Redis 鍵名

  • path:JSONPath,默認 $ 根;可用 .[*]/.. 多路徑匹配

  • start / stop:要保留的 [start, stop] 閉區間索引

    • 支持負值(從尾部數)
    • 越界也不會報錯,而是自動鉗位
    • start > stopstart ≥ 數組長度 ? 結果為空數組,返回 0

返回值:與路徑對應的新數組長度;若路徑不是數組 ? nil

時間復雜度

  • 單路徑 → O(N),N 為數組長度
  • 多路徑 → O(N × 匹配數)

2、核心特性 & 場景

功能應用示例
滑動窗口日志只保留最近 k 條、限流計數器
排行榜截斷取前 100 名:start=0 stop=99
RingBuffer寫前 ARRTRIM -capacity -1
批量歸檔ARRTRIM 保留近檔,再把彈出數據寫冷庫

3、CLI 實戰:給耳機音量檔裁剪“窗口”

3.1 初始化并追加

# 12 個檔位
JSON.ARRAPPEND key $.[1].max_level 140 160 180 200 220 240 260 280
# -> (integer) 12

3.2 僅保留第 5-9 位(含 4 – 8)

redis> JSON.ARRTRIM key $.[1].max_level 4 8
1) (integer) 5

數組變為 [140, 160, 180, 200, 220]

3.3 保留最近 3 條(負索引)

redis> JSON.ARRTRIM key $.[1].max_level -3 -1
1) (integer) 3

4、越界 & 容錯細節(v2.0+)

  • start < 0 → 從尾部數
  • stop > len-1 → 自動截到尾
  • start > stop → 數組置空,返回 0
  • 空數組裁剪仍返回 0 而非錯誤

因此大膽裁剪不必先算長度,適合高并發窗口滑動。

5、跨語言實戰

5.1 Python(redis-py ≥ 5.0)

from redis import Redis
r = Redis(decode_responses=True)# 僅保留最近 100 條
r.execute_command("JSON.ARRTRIM", "chat:room:42", "$.msgs", -100, -1)

5.2 Node.js(@redis/client)

import { createClient } from 'redis';
const cli = createClient(); await cli.connect();// 排行榜:只留前 50
await cli.json.arrTrim('rank:game', '$.players', 0, 49);

5.3 Go(go-redis/v9)

_, _ = rdb.Do(ctx, "JSON.ARRTRIM","sensor:temp", "$.records", -3600, -1).Result() // 保留最近一小時秒級點

6、最佳實踐

  1. 寫后即裁

    JSON.ARRAPPEND key $.logs '"new"'  \
    && JSON.ARRTRIM key $.logs -1000 -1   # 保 1000 條
    

    兩條指令可用 MULTI/EXEC 或 Lua 保證原子順序。

  2. 配合定時任務
    對歷史不敏感場景,每 N 分鐘統一裁剪降壓。

  3. 避免大范圍多路徑
    通配 $..* 上萬數組會致 O(N2);拆文檔或逐鍵裁剪。

  4. 鏈式操作
    ARRTRIM 后再 ARRLEN 檢測是否需縮容或歸檔。

7、與數組家族的最終協同

需求推薦組合
固定大小消息隊列ARRAPPENDARRTRIM -max -1
排行榜更新分數變動后排序(客戶端)→ ARRTRIM 0 99
限流計數寫前 ARRTRIM -window -1ARRLEN 判斷是否超閾
熱→冷數據遷移ARRTRIM 出窗口外數據,用 ARRPOP 逐條搬遷

8、結語:數組六神技大集合

ARRAPPEND / ARRINSERTARRINDEXARRPOPARRLENARRPOPARRTRIM

至此,RedisJSON 數組全家桶已完全解鎖:

  • :動態插入 / 追加
  • :定位元素
  • :獲取長度
  • :單條彈出 or 批量裁剪

合理組合即可構建高效、原子、安全的數組數據結構。希望本系列能讓你在高并發 JSON 數據處理上游刃有余!🎉

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

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

相關文章

fpga調試經驗

fpga調試經驗 調測場景&#xff1a; 外接adc傳感器芯片&#xff0c;采集壓力&#xff0c;溫度等模擬量&#xff0c;fpga通過spi/i2c接口與adc傳感器芯片通信 問題1&#xff1a;adc芯片在穩定環境中&#xff0c;輸出數字量不穩定。 結論&#xff1a;adc輸入電壓由fpga板供應&…

cefSharp.WinForms.NETCore 138.xx (cef138/Chromium 138.0.7204.97) 升級測試體驗

一、版本說明及變化 該版本支持cef138.0.x系列,cefsharp138.0.170 無重大更新;該版本暫不支持h264,請關注后續 關注欄目,關注我,學習cefsharp少走彎路 不迷路! CefSharp 設置緩存的注意事項參考 說明:欄目是訂閱文章,無附件,如需要單獨獲取(看底部介紹說明) 該版本1…

chatgpt是怎么誕生的,詳解GPT1到GPT4的演化之路及相關背景知識

人工智能革命正在發生&#xff0c;我們是何其幸運的一代&#xff0c;能親眼見證人類/機器智能的大爆發。 僅僅作為這場革命的看客顯然是有些遺憾的&#xff0c;如何進一步了解它&#xff1f; 本文將討論chatgpt的誕生過程&#xff0c;串聯起OpenAI發表的一系列重要論文&#…

[筆記] 動態 SQL 查詢技術解析:構建靈活高效的企業級數據訪問層

文章目錄一. 應用場景二. 使用示例示例1示例2示例3三. 實現1. 動態表查詢構建器&#xff0c;模仿MyBatis-Plus2. mapper3. mapper.xml功能概述參數說明四. 動態 SQL 的優化與風險防控在企業級應用開發中&#xff0c;數據查詢場景往往呈現出復雜多變的特點 —— 從簡單的單表篩選…

.net天擎分鐘降水數據統計

1.需求&#xff1a;計算滑動時間下的1小時、3小時、6小時、12小時、24小時降水數據&#xff0c;統計這個時間下的分鐘級降水數據2.分析第一版本&#xff1a;降水分鐘級數據保存時間不長&#xff0c;保存太多意義不大&#xff0c;以更新的形式來保存這些統計數據效果會比較好&am…

圖片合并pdf

文章目錄 背景目標實現下載 背景 整合&#xff1a; 將零散的圖片集合成一個單一文件。有序化&#xff1a; 固定圖片的排列順序。標準化&#xff1a; 轉換為通用、兼容性強的PDF格式。高效管理&#xff1a; 便于存儲、查找、分享和傳輸。正式化/文檔化&#xff1a; 滿足提交、報…

【vue3+js】文件下載方法整理

前端文件下載方式 引言 在前端開發中,文件下載是一個常見的需求。后端可能以不同的方式返回文件數據,前端需要根據不同的返回類型采用相應的處理方式。本文將總結幾種常見的后端返回類型及對應的前端處理方案,主要基于Vue3和JavaScript環境。 一、后端返回文件URL 場景描…

MicrobiomeStatPlots | 森林圖教程Forest plot tutorial

視頻講解https://www.bilibili.com/video/BV1mA3yzEEnc/森林圖簡介什么是森林圖&#xff1f;參考&#xff1a;https://mp.weixin.qq.com/s/vwNf_sFlmhp7DeSYaQ3NxQ森林圖是以統計指標和統計分析方法為基礎&#xff0c;用數值運算結果繪制出的圖形。它在平面直角坐標系中&#x…

vscode 打開項目時候,有部分外部依賴包找不到定義或者聲明,但是能使用cmake正常編譯并且運行

解決&#xff1a;是依賴路徑的問題&#xff0c;先看includePath對不對&#xff0c;但是有時候會依賴外部文件&#xff0c;這時候入股cmake編譯能夠聽過&#xff0c; 說明編譯器能夠找到依賴路徑&#xff0c; 但是vscode的 IntelliSense 找不到依賴路徑 → 導致編輯器提示錯誤、…

nginx:SSL_CTX_use_PrivateKey failed

SSL_CTX_use_PrivateKey("/home/nginx-vue/cret/*.com.key") failed (SSL: error:0B080074:x509 certificate routines:x509_check_private_key:key values mismatch) Nginx 嘗試加載私鑰文件時失敗&#xff0c;原因是&#xff1a;證書與私鑰不匹配 問題本質 SSL 證…

Docker 基于 Cgroups 實現資源限制詳解【實戰+源碼】

本文將帶你深入理解 Docker 如何借助 Linux Cgroups 實現對內存、CPU 等系統資源的精細化控制&#xff0c;并提供完整演示與圖解、Compose 配置模板和資源包下載&#xff0c;適合初學者與工程師深入學習與實戰。 文章目錄 一、什么是 Cgroups&#xff1f;為什么對容器如此關鍵…

Linux中的系統日志(Rsyslog)

一、實驗環境主機名系統網絡適配器IP地址serverarhel9NAT模式172.25.254.11/24serverbrhel9NAT模式172.25.254.22/24二、Rsyslog的基本參數&#xff08;1&#xff09;安裝rsyslog&#xff08;2&#xff09;rsyslog的服務名稱&#xff08;3&#xff09;rsyslog的主配置文件rsysl…

Spring Boot + Thymeleaf + RESTful API 前后端整合完整示例

關鍵詞&#xff1a;Spring Boot、Thymeleaf、RESTful API、前后端整合、用戶管理 ? 功能概述 本文將為你提供一個完整的 Spring Boot Thymeleaf RESTful API 的前后端整合項目&#xff0c;實現以下功能&#xff1a; 模塊功能用戶管理查看用戶列表、新增用戶、刪除用戶后端…

從零開始的MySQL學習

MySQL 從零開始的MySQL學習 第一節 數據庫 重點&#xff1a;數據庫通過SQL等標準語言進行動作&#xff0c;數據庫的概念、分類&#xff0c;數據管理系統&#xff08;操縱和管理數據庫的大型軟件&#xff09; 數據庫&#xff08;Database&#xff09; 是按照數據結構來組織、存儲…

Docker 高級管理--Dockerfile鏡像制作

二:Dockerfile 語法基礎 1:基礎指令 (1)FROM 指定基礎鏡像&#xff0c;所有的 Dockerfile 都必須以 FROM 指令開頭&#xff0c;它定義了新鏡像基于哪個基礎鏡像構建。 FRoM ubuntu:20.04 (2)MAINTAINER(已奔用&#xff0c;推薦使用LABEL) 用于指定鏡像的維護者信息。不過在較…

LeetCode 692題解 | 前K個高頻單詞

前K個高頻單詞一、題目鏈接二、題目三、分析四、代碼一、題目鏈接 692.前K個高頻單詞 二、題目 三、分析 本題目我們利用map統計出次數以后&#xff0c;返回的答案應該按單詞出現頻率由高到低排序&#xff0c;有一個特殊要求&#xff0c;如果不同的單詞有相同出現頻率&#…

C++ 中的 std::bind 用法

在現代 C++ 編程中,std::bind 是一個非常強大但常常被誤解的工具。它允許我們將函數(包括成員函數)、參數進行綁定,并生成一個新的可調用對象。這在編寫異步回調、事件處理、適配器模式等場景中非常有用。 ?? 一、std::bind 是什么? std::bind 是定義在 <functiona…

Spring Boot秒級冷啟動方案:阿里云FC落地實戰(含成本對比)

Spring Boot秒級冷啟動方案&#xff1a;阿里云FC落地實戰&#xff08;含成本對比&#xff09;一、冷啟動痛點與FC核心優勢1. 傳統Spring Boot冷啟動瓶頸2. 阿里云FC核心能力二、秒級冷啟動架構設計1. 整體架構2. 關鍵組件選型三、5大核心優化策略1. 應用瘦身&#xff08;JAR包精…

搜索引擎vs向量數據庫:LangChain混合檢索架構實戰解析

本文較長&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型應用開發學習視頻及資料&#xff0c;盡在聚客AI學院。一、LangChain搜索工具實戰&#xff1a;集成DuckDuckGo實現實時信息查詢 核心場景&#xff1a;解決大模型知識滯后問題&#xff0c;通過搜索引擎獲取實…

【算法】貪心算法:將數組和減半的最少操作次數C++

文章目錄前言題目解析算法原理代碼示例策略證明前言 題目的鏈接&#xff0c;大家可以先試著去做一下再來看一下思路。2208. 將數組和減半的最少操作次數 - 力扣&#xff08;LeetCode&#xff09; 題目解析 要認真去把題目看一遍&#xff0c;畫出題目中的有用信息。 示例一定是…