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.tpcf.cn/diannao/91164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;画出题目中的有用信息。 示例一定是…