当前位置: 首页 > news >正文

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(N²);拆文档或逐键裁剪。

  4. 链式操作
    ARRTRIM 后再 ARRLEN 检测是否需缩容或归档。

7、与数组家族的最终协同

需求推荐组合
固定大小消息队列ARRAPPENDARRTRIM -max -1
排行榜更新分数变动后排序(客户端)→ ARRTRIM 0 99
限流计数写前 ARRTRIM -window -1ARRLEN 判断是否超阈
热→冷数据迁移ARRTRIM 出窗口外数据,用 ARRPOP 逐条搬迁

8、结语:数组六神技大集合

ARRAPPEND / ARRINSERTARRINDEXARRPOPARRLENARRPOPARRTRIM

至此,RedisJSON 数组全家桶已完全解锁:

  • :动态插入 / 追加
  • :定位元素
  • :获取长度
  • :单条弹出 or 批量裁剪

合理组合即可构建高效、原子、安全的数组数据结构。希望本系列能让你在高并发 JSON 数据处理上游刃有余!🎉

http://www.dtcms.com/a/277335.html

相关文章:

  • 5G NR PDCCH之处理流程
  • [Nagios Core] CGI接口 | 状态数据管理.dat | 性能优化
  • k8s存储入门
  • RabbitMQ 之仲裁队列
  • Matplotlib 中 plt.pcolormesh 函数的使用详解
  • 【sql学习之拉链表】
  • 【LLM-Agent】Qwen-Agent智能体框架使用
  • trySend、Channel 和 Flow 的工作原理
  • 【CMake】CMake创建、安装、使用静态库和动态库
  • 操作系统-第四章存储器管理和第五章设备管理-知识点整理(知识点学习 / 期末复习 / 面试 / 笔试)
  • 【hivesql 已知维度父子关系加工层级表】
  • C++每日刷题day2025.7.13
  • 什么是RAG(Retrieval-Augmented Generation)?一文读懂检索增强生成
  • RabbitMQ面试精讲 Day 2:RabbitMQ工作模型与消息流转
  • 12.I/O复用
  • 前端性能与可靠性工程:资源优化 - 加载性能的“低垂果实”
  • 从零开始学习深度学习-水果分类之PyQt5App
  • SpringBoot集成Redis、SpringCache
  • C++ 强制类型转换
  • 【操作系统】strace 跟踪系统调用(一)
  • (LeetCode 每日一题) 2410. 运动员和训练师的最大匹配数(排序、双指针)
  • es里为什么node和shard不是一对一的关系
  • Augment AI 0.502.0版本深度解析:Task、Guidelines、Memory三大核心功能实战指南
  • 将 NumPy 数组展平并转换为 Python 列表
  • 1.1.5 模块与包——AI教你学Django
  • OpenLayers 入门指南【二】:坐标系与投影转换
  • 把 DNA 当 PCIe:一条 365 nt 链实现 64 Gbps 片上光互连——基于链式 Förster 共振的分子级波分复用链路
  • 理解 Robots 协议:爬虫该遵守的“游戏规则”
  • MySQL逻辑删除与唯一索引冲突解决
  • M00224-小范围疫情防控元胞自动机模拟matlab