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

RedisJSON 技术揭秘(五)`JSON.ARRPOP` 原子弹出 修改数组的终极手段

1、指令速查

JSON.ARRPOP <key> [path [index]]
  • key:要修改的 Redis 键

  • path(可省略,默认 $):JSONPath,可用 .. / [*] 多路径匹配

  • index(可省略,默认 -1):要弹出的位置

    • 0 → 头元素
    • -1 → 尾元素(等同于栈/队列 pop)
    • 其他负值 → 从末尾倒数
    • 越界会被自动钳位到数组两端
    • 空数组返回 null

返回值:与路径一一对应的被弹出元素;若路径不是数组 → nil

时间复杂度

  • 单路径且弹出尾部O(1)
  • 其他情况(头部 / 中间 / 多路径)→ O(N) ,N 为数组长度

2、核心优势

  1. 原子性:读 + 删一步到位,避免并发脏写
  2. 网络极简:只需一次 RTT
  3. 读写对等:返回值就是被删元素,可立即写入别处或计算
  4. 队列 / 栈场景天然契合:尾弹 (index = -1) = Stack;头弹 (index = 0) = Queue

3、CLI 实战:耳机产品的 max_level 管理

3.1 创建数据

JSON.SET key $ '[{"name":"Healthy","max_level":[60,70,80]},{"name":"Noisy","max_level":[80,90,100,120]}]'

3.2 弹出第二个产品的首个 max_level

redis> JSON.ARRPOP key $.[1].max_level 0
1) "80"

数组变为 [90,100,120],同时我们拿到了被删除的 80

3.3 再 Tail-Pop

redis> JSON.ARRPOP key $.[1].max_level    # index 默认为 -1
1) "120"

现在数组仅剩 [90,100]

4、跨语言示例

Python(redis-py ≥ 5.0)

from redis import Redis
r = Redis(decode_responses=True)popped = r.execute_command("JSON.ARRPOP", "key", "$.[1].max_level", 0
)
print(popped)   # ["80"]

Node.js(@redis/client)

import { createClient } from 'redis';
const cli = createClient(); await cli.connect();const [pop] = await cli.json.arrPop('key', '$.[1].max_level',  -1);
console.log(pop); // 120

Go(go-redis/v9)

popped, _ := rdb.Do(ctx, "JSON.ARRPOP","key", "$.[0].max_level", -1).StringSlice()
log.Println(popped[0])   // "80"

5、典型应用场景

场景玩法
任务队列Workers:ARRPOP tasks $.queue 0 → 取出并删除头任务
缓存逐出策略列表存最近记录,长度 > limit 时先 ARRPOP key $.list 0ARRAPPEND
移动元素ARRPOP src + ARRAPPEND dst 可原子搬迁(用 Lua/事务更稳)
限流每次写前 ARRLEN,超限则 ARRPOP 头部旧数据

6、性能&陷阱

  • 优先尾弹:尾部 ARRPOP → O(1),头/中间 O(N)
  • 多路径慎用$..array 会对每个匹配执行弹出,整体 O(N)
  • 空数组/不存在:返回 null,注意判空
  • 并发栈/队列:多个客户端同时 ARRPOP 尾部仍是安全的,但若需要一次弹出并插入别的键建议 Lua 脚本或 MULTI 保证一致性

7、与数组家族指令的协同

  • ARRAPPEND/ARRINSERT:弹后再插,重排元素
  • ARRLEN:弹前统计,判断是否已空
  • ARRINDEX:先查后弹,删除指定值
  • ARRTRIM(下一篇):批量裁剪 vs 单条弹出

8、结语

至此,RedisJSON 对数组的增(APPEND / INSERT)查(INDEX / LEN)、**删(POP)**已全部解锁。JSON.ARRPOP 通过原子弹出让你在队列、限流与实时数据清洗场景中如虎添翼。下一篇,我们将迎来本系列终章——JSON.ARRTRIM,聚焦批量裁剪与窗口化数组,敬请期待!

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

相关文章:

  • git实操
  • HTML 标题标签
  • 香港理工大学实验室定时预约
  • 【windows办公小助手】快速搜索文件及文件所处目录everything
  • 内存对齐与缓存优化:从硬件原理到代码实战
  • 前端进阶之路-从传统前端到VUE-JS(第五期-路由应用)
  • 通信网络编程5.0——JAVA
  • 新手向:使用Python从PDF中高效提取结构化文本
  • LeetCode经典题解:21、合并两个有序链表
  • 【基础算法】倍增
  • Qt:编译qsqlmysql.dll
  • React强大且灵活hooks库——ahooks入门实践之常用场景hook
  • NoSQL 介绍
  • day052-ansible handler、roles与优化
  • Spring AI 项目实战(十七):Spring + AI + 通义千问星辰航空智能机票预订系统(附完整源码)
  • SDN软件定义网络架构深度解析:分层模型与核心机制
  • Datawhale AI 夏令营【更新中】
  • java虚拟线程
  • 面试150 从中序与后序遍历构造二叉树
  • Maven项目没有Maven工具,IDEA没有识别到该项目是Maven项目怎么办?
  • html案例:编写一个用于发布CSDN文章时,生成有关缩略图
  • 【拓扑排序+dfs】P2661 [NOIP 2015 提高组] 信息传递
  • 线下门店快速线上化销售四步方案
  • 在i.MX8MP上如何使能BlueZ A2DP Source
  • 如何设计高并发架构?深入了解高并发架构设计的最佳实践
  • Nature子刊 |HERGAST:揭示超大规模空间转录组数据中的精细空间结构并放大基因表达信号
  • DETRs与协同混合作业训练之CO-DETR论文阅读
  • Pandas 的 Index 与 SQL Index 的对比
  • Flask中的路由尾随斜杠(/)
  • SQL140 未完成率top50%用户近三个月答卷情况