RedisJSON 指令精講JSON.STRLEN 高效統計字符串長度

1 · 場景與價值

在日志累加、指標采集、消息追蹤等場景中,我們常需快速判斷某個字符串字段“到底有多長”,以便:

  • 阻止過大日志:若長度超限則截斷或歸檔;
  • 動態分桶:按長度選擇不同存儲策略;
  • 性能監控:突然飆長可能暗示異常循環或惡意輸入。

有了 JSON.STRLEN,無需把整段內容取回客戶端,也無需額外存副本,即可 O(1) 地獲取字段長度。

2 · 指令概覽

指令作用復雜度
JSON.STRLEN key [path]返回指定路徑 JSON 字符串的長度O(1)(單路徑) / O(N)(多路徑,與鍵大小相關)
  • 可用版本:RedisJSON ≥ 1.0
  • ACL 標簽@json @read @slow
  • 默認路徑$(根)

3 · 語法參數

JSON.STRLEN <key> [<path>]
參數必填說明
key?目標鍵名
pathJSONPath,缺省為 $

返回值

  • 若匹配為字符串:返回其長度(整型)。
  • 若路徑不存在 / 類型非字符串:返回 nil
  • 多路徑:遞歸數組,順序對應各匹配點。

4 · 基本示例

redis> JSON.SET doc $ '{"a":"foo","nested":{"a":"hello"},"nested2":{"a":31}}'
OK# 多路徑統計
redis> JSON.STRLEN doc $..a
1) (integer) 3     # $.a -> "foo"
2) (integer) 5     # $.nested.a -> "hello"
3) (nil)           # $.nested2.a 不是字符串

5 · 常見用法場景

5.1 日志超長保護

> len=$(redis-cli JSON.STRLEN log:123 $.trace)
> if [ "$len" -gt 2048 ]; then
>   redis-cli JSON.SET log:123 $.trace '"<truncated>"'
> fi

5.2 統計動態字段占用

# 查看所有用戶簡介 bio 的平均長度
redis-cli --raw KEYS "user:*" | while read k; doredis-cli JSON.STRLEN $k $.bio
done | awk '{s+=$1;c++} END{print s/c}'

6 · 踩坑與注意

癥狀解決方案
路徑非字符串返回 nil,誤以為不存在JSON.TYPE 或保證字段類型一致
多路徑掃描過大文檔延遲抖動精準路徑,避免 $..field
空鍵 / 空路徑直接 nil先用 EXISTSJSON.TYPE 判斷
把數組當字符串長度不是元素數STRLEN 只算字節數,不是元素數,數組用 JSON.ARRLEN

7 · Go-Redis 完整示例

package mainimport ("context""fmt""log""github.com/redis/go-redis/v9"
)func main() {ctx := context.Background()rdb := redis.NewClient(&redis.Options{Addr: "localhost:6379"})defer rdb.Close()// 初始化測試文檔_, err := rdb.Do(ctx, "JSON.SET", "msg:1", "$",`{"body":"hello world","meta":{"note":"short"}}`).Result()if err != nil { log.Fatal(err) }// 1?? 單路徑長度len1, _ := rdb.Do(ctx, "JSON.STRLEN", "msg:1", "$.body").Int64()fmt.Println("body len =", len1) // 11// 2?? 多路徑長度res, _ := rdb.Do(ctx, "JSON.STRLEN", "msg:1", "$..note").Slice()fmt.Println("meta.note len =", res[0]) // 5// 3?? 類型不符示例_, _ = rdb.Do(ctx, "JSON.SET", "msg:1", "$.count", 100)res2, _ := rdb.Do(ctx, "JSON.STRLEN", "msg:1", "$.count").Slice()fmt.Printf("count -> %#v\n", res2[0]) // <nil>
}

8 · 性能建議

  1. 批量調用使用 Pipeline

    pipe := rdb.Pipeline()
    keys := []string{"user:1", "user:2", "user:3"}
    for _, k := range keys {pipe.Do(ctx, "JSON.STRLEN", k, "$.bio")
    }
    _, _ = pipe.Exec(ctx)
    
  2. 監控慢查詢
    復雜 JSON + 多路徑 ($..field) 會觸發 SLOWLOG,需關注。

  3. 字符串膨脹預警
    可用 MEMORY USAGE key + JSON.STRLEN 建立長度閾值報警。

9 · 與其它指令的協同

需求組合說明
追加后檢測JSON.STRAPPENDJSON.STRLEN先寫后查,防止長度爆表
長度分片JSON.STRLEN + JSON.SET達閾值切換到新字段
類型校驗JSON.TYPE + JSON.STRLEN防止對非字符串統計

10 · 總結

  • JSON.STRLEN 提供 O(1) 字段級長度統計,是日志與配額場景的利器。
  • 返回值為整型或 nil,多路徑時請按序處理。
  • 精準路徑 ? 通配路徑,能顯著降低 O(N) 掃描成本。
  • 在 Go-Redis 中用 Do() 一行即可調用,并能與 Pipeline/事務無縫整合。

至此,字符串家族三兄弟 STRLEN / STRAPPEND / SET 已全部集齊。靈活運用它們,你的 RedisJSON 文檔讀寫將更加高效、細粒度且安全。祝編碼愉快,歡迎留言交流實踐體會!

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

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

相關文章

大數據量查詢計算引發數據庫CPU告警問題復盤

大數據量查詢計算引發數據庫CPU告警問題復盤一、背景二、根因分析三、解決方案方案1&#xff1a;多線程緩存方案2&#xff1a;利用中間表緩存四、總結一、背景 2025年7月份某天&#xff0c;CDP系統每天不定時推送我們的Portal服務&#xff0c;生產環境運營看板會展示統計數據&…

2025最新版虛幻引擎5(UE5)C++入門教程:前言——你的隨身教程和學習筆記

大家好&#xff0c;我是開發游戲的老王&#xff0c;一名高校教師&#xff0c;我主講游戲開發已有十余年時間&#xff0c;通過我的博客大家應該可以了解我所涉獵的游戲技術范疇非常廣泛&#xff0c;除了Unreal,Unity,Godot等主流游戲引擎&#xff0c;還包括Blender、Houdini、3D…

(3)重定向 | 時間相關指令 | 文件查找 | 打包與壓縮

Ⅰ . 初始重定向01 輸出重定向 >在上一節中我們為了方便講解 head 和 tail 指令&#xff0c;我們用到了 > 去生成了一千行文本。通過 > 將生成的一千行文本寫入到了 large.txt 中……我們現在來正式介紹一下&#xff1a;$ echo "內容" > [目標] 本來應…

DTH11測量溫濕度學習(第十一天)

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;開發者-削好皮的Pineapple! &#x1f468;?&#x1f4bb; hello 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 削好皮的Pineapple! 原創 &#x1f468;?&#x1f4…

Go語言初識--標識符 可見性

Go語言初識–標識符 可見性 和C語言相似&#xff0c;go語言的基本組成有&#xff1a; 包聲明&#xff0c;編寫源文件時&#xff0c;必須在非注釋的第一行指明這個文件屬于哪個包&#xff0c;如package main。引入包&#xff0c;其實就是告訴Go 編譯器這個程序需要使用的包&…

Python實例之畫小豬佩奇

效果圖&#xff1a;python代碼以及解釋&#xff0c;沒有運用模塊。 """ 繪制小豬佩奇 """ from turtle import *def nose(x,y):"""畫鼻子"""penup()# 將海龜移動到指定的坐標goto(x,y)pendown()# 設置海龜的方向&…

Unity筆記——事件中心

事件中心是什么事件中心是 Unity 游戲開發中常用的架構設計&#xff0c;它基于觀察者模式 或 發布-訂閱模式&#xff0c;通過委托和事件構建的一種消息管理系統。主要用于降低代碼耦合度&#xff0c;實現模塊間的松耦合通信的消息處理系統能大幅提升代碼的可維護性和擴展性&…

Java: 反射機制的 ParameterizedType(參數化類型)

在 Java 中&#xff0c;ParameterizedType 是 java.lang.reflect 包下的一個接口&#xff0c;屬于反射 API 的一部分&#xff0c;主要用于表示參數化類型&#xff08;即帶有類型參數的泛型類型&#xff09;。它是 Java 反射機制中處理泛型類型信息的關鍵接口之一。 一、什么是參…

OkHttp 與 Retrofit 完美結合:打造高效的 Android 網絡請求

前言在現代 Android 開發中&#xff0c;網絡請求是幾乎每個應用都必不可少的功能。OkHttp 和 Retrofit 作為當前最流行的網絡請求庫組合&#xff0c;為開發者提供了簡潔高效的解決方案。本文將詳細介紹如何將這兩者結合使用&#xff0c;充分發揮它們的優勢。一、OkHttp 和 Retr…

系統辨識建模

系統辨識建模 一、系統辨識建模的作用 1. 建立真實物理系統的數學模型 2. 為后續控制器/強化學習算法提供仿真環境 3. 提高控制精度和安全性 二、本文的系統辨識是怎么做的 1. 實驗采集 2. 數學建模 3. 在控制系統中的作用 三、實際用法流程(簡化版) 1. 系統辨識階段 2. 強化…

Android開發:Java與Kotlin深度對比

1. 語言特性與現代性 Java (特別是 Android 主要使用的 Java 8 及之前版本): 相對冗長&#xff1a; 需要編寫更多的樣板代碼&#xff08;如 getter/setter、findViewById 的顯式類型轉換、匿名內部類等&#xff09;。空指針異常 (NPE)&#xff1a; 類型系統默認允許 null&#…

米家打印機驅動:Wi-Fi 無線打印絲滑順暢不卡頓,從此告別對打印機干瞪眼

各位小米家居控們&#xff0c;你們有沒有過這種經歷&#xff0c;新買的打印機回家&#xff0c;結果電腦跟它像倆傲嬌的小情侶&#xff0c;死活不搭話&#xff1f;急得你想當場表演一個“打印機抱頭痛哭”&#xff1f;別急&#xff0c;今天就給你們安利個神隊友——米家打印機驅…

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(7):自動詞 & 他動詞

日語學習-日語知識點小記-構建基礎-JLPT-N3階段&#xff08;7&#xff09;&#xff1a;自動詞 &#xff06; 他動詞1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰2、知識點&#xff08;&#xff11;&#xff09;自動詞 &#xff06; 他動…

深入理解設計模式:訪問者模式詳解

在軟件開發中&#xff0c;我們經常會遇到需要對一個復雜對象結構進行操作的情況。隨著需求的不斷變化&#xff0c;我們可能需要在這個對象結構上添加各種新的操作。如果直接在對象結構中添加這些操作&#xff0c;會導致類的職責過重&#xff0c;且每次添加新操作都需要修改原有…

Linux timerfd 定時器封裝

使用 timerfd epoll() 實現&#xff0c;簡潔精確。沒定義 MU_ERROR 宏的話替換為 printf 即可。mu_timer.h:#ifndef _MU_TIMER_H_ #define _MU_TIMER_H_#ifdef __cplusplus extern "C" { #endif#include <stdint.h> #include <time.h> #include <pth…

【樣式效果】Vue3實現仿制iOS按鈕動態效果

iOS開關效果定義變量&#xff1a; <style scoped lang"scss">.layout {// 按鈕寬度$button-width: 500px;// 按鈕高度$button-height: 250px;// 按鈕里面圓形直徑$circle-diameter: 200px;// 按鈕背景與里面圓形間距$button-circle-offset:calc(($button-he…

京東瘋狂投資具身智能:眾擎機器人+千尋智能+逐際動力 | AI早報

每日分享全球最新AI資訊【應用商業八卦技術】&#xff0c;&#x1f30f;&#xff1a;未來世界2099應用 1、馬斯克推出兒童AI"Baby Grok"引熱議&#xff1a;安全性能否經受考驗&#xff1f; 2、螞蟻AQ健康應用霸榜蘋果商店&#xff0c;或將聯手Apple Watch打造智能健康…

Jiasou TideFlow AIGC SEO Agent:全自動外鏈構建技術重構智能營銷新標準

AI時代SEO技術革命&#xff1a;企業如何突破流量增長瓶頸&#xff1f;隨著Google算法升級至MUM模型&#xff0c;傳統SEO工具已難以應對多模態內容優化需求。在搜索引擎日均處理120億次查詢的生態中&#xff0c;企業官網平均自然流量轉化周期長達6-8個月&#xff0c;因此諸如Jia…

Docker-compose:服務編排

Docker-compose 介紹 服務編排:按照一定的業務規則批量管理容器 在微服務架構的應用系統中,一般包含 N 個微服務,且每個微服務一般都會部署多個實例。此時,如果每個微服務都要手動啟停,維護的工作量會很大。 要從 Dockerfile build image 或者去 docker hub 拉取 image …

異地服務器備份Mysql數據

前言異地服務器備份Mysql數據即Mysql的server端與備份服務器不是同一個。Mysql服務端安裝在192.168.3.36中&#xff0c;現在需要在IP為192.168.209.129的服務器中使用mysqldump命令備份指定數據庫數據;192.168.209.129沒有裝過Mysql客戶端;1.安裝Mysql客戶端不安裝Mysql客戶端就…