1 、 为什么选择 JSON.ARRAPPEND

在传统的键值模型里,若要往数组尾部追加元素,通常需要 取→改→写 三步:

  1. GET 整个 JSON;
  2. 在应用层把元素 push 进数组;
  3. SET 回 Redis。

一条 JSON.ARRAPPEND 则可一次完成,具备三个显著优势:

  • 原子性:整个追加在 Redis 内部完成,无并发写冲突。
  • 网络开销极小:一次往返即可。
  • O(1) 或 O(N) 级别时间复杂度:当路径只命中单个数组时为常数时间;若路径匹配多处才与数组大小成正比 ([AWS 文檔][1])。

2 、语法速查

JSON.ARRAPPEND <key> <path> <value> [value ...]
  • key:待修改的 Redis 键。
  • path:JSONPath,默认为 $
  • value:一个或多个 JSON 值,依次附加到目标数组尾部。

字符串陷阱
要往数组里追加字符串,需再包一层外引号,如:'"blue"'。这是因为 Redis CLI 会把参数当作原始文本;再套一层可避免 Redis 解析器把内部引号剥掉 ([Upstash: Serverless Data Platform][2])。

返回值
与路径一一对应的整型数组,元素为追加后的数组长度;若匹配到的值不是数组,则对应位置返回 nil ([AWS 文檔][1])。

3、动手实践:为商品新增颜色

# ① 创建文档
JSON.SET item:1 $ '{"name":"Noise-cancelling Bluetooth headphones","colors":["black","silver"]
}'
# ② 追加 "blue"
JSON.ARRAPPEND item:1 $.colors '"blue"'
# -> (integer) 3
# ③ 验证
JSON.GET item:1 $.colors
# -> [["black","silver","blue"]]

以上流程仅用一次网络往返就完成数组更新,且返回值 3 表示数组新长度。

4、跨语言示例

4.1 Python(redis-py ≥ 5.0)

from redis import Redis
from redis.commands.json.path import Pathr = Redis(host="localhost", port=6379, decode_responses=True)
r.json().set("item:1", Path.root_path(), {"colors": ["black", "silver"]})
new_len = r.json().arrappend("item:1", Path(".colors"), "blue")
print("新长度:", new_len)   # -> [3]

4.2 Node.js(@redis/client)

import { createClient } from 'redis';const client = createClient();
await client.connect();await client.json.set('item:1', '$', { colors: ['black', 'silver'] });
const [len] = await client.json.arrAppend('item:1', '$.colors', 'blue');
console.log(len); // 3

4.3 Go(go-redis/v9)

rdb := redis.NewClient(&redis.Options{Addr: "localhost:6379"})
_, _ = rdb.Do(ctx, "JSON.SET", "item:1", "$", `{"colors":["black","silver"]}`).Result()
len, _ := rdb.Do(ctx, "JSON.ARRAPPEND", "item:1", "$.colors", `"blue"`).IntSlice()
log.Println(len[0]) // 3

5、性能与内存考量

场景建议说明
单用户操作直接调用 JSON.ARRAPPENDO(1),延迟可忽略
批量写入使用 PipelineMULTI/EXEC减少 RTT,可把 1 ms 延迟压到 0.2 ms
高并发写同一键利用 Redis 分区键Sharding避免热点,单核 RDBGIL 成为瓶颈
极大数组(>10 MB)考虑拆分文档或转 KV 列表巨型 JSON 会拖慢序列化与 AOF

内存层面,RedisJSON 内部以二进制树存储 JSON,每个值至少 8 bytes ([DEV Community][3])。大量小数组元素时,务必关注 RSS。

6、常见误区 & 排错

现象根因解决方案
返回 nil路径指向的值不是数组确认 JSON.TYPE key path
数组里出现多层引号字符串未正确包双引号改用 '"text"'
CLI 追加 JSON 对象失败参数被 shell 吞字符--raw 或文件重定向
性能突降路径命中多处,复杂度 O(N)精确路径或重构文档

7、进阶话题

  1. JSON.ARRINSERTJSON.ARRPOP 搭配
    ARRAPPEND 只能尾插,若需头插可用 ARRINSERT key path 0 value,同时 ARRPOP 支持按索引弹出。
  2. 结合 RedisSearch
    给数组字段加 TAG/TEXT 索引,追加后可实时被搜索,无需重建索引。
  3. 多路径写操作
    JSON.ARRAPPEND key $..colors '"red"' '"green"' 一次更新多处,但复杂度 ≥ O(N)。
  4. 幂等写法
    若不希望重复追加,可先 JSON.ARRINDEX 检查元素是否已存在。

8、结语

JSON.ARRAPPEND 把「往数组尾部追加元素」这件小事做到极致简单,却蕴含了 RedisJSON 的设计哲学:把常见的 JSON 变更下沉到数据库层,用原子指令解除并发焦虑
掌握其用法、理解性能边界、配合其他 JSON 指令组合拳,你就能在高吞吐实时应用中优雅地操纵复杂文档结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88846.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88846.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88846.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14:00开始面试,14:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到4月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

Unity物理系统由浅入深第四节:物理约束求解与稳定性

Unity物理系统由浅入深第一节&#xff1a;Unity 物理系统基础与应用 Unity物理系统由浅入深第二节&#xff1a;物理系统高级特性与优化 Unity物理系统由浅入深第三节&#xff1a;物理引擎底层原理剖析 Unity物理系统由浅入深第四节&#xff1a;物理约束求解与稳定性 物理引擎的…

深入浅出Kafka Consumer源码解析:设计哲学与实现艺术

一、Kafka Consumer全景架构 1.1 核心组件交互图 #mermaid-svg-JDEEOd2M5PzLkYa6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JDEEOd2M5PzLkYa6 .error-icon{fill:#552222;}#mermaid-svg-JDEEOd2M5PzLkYa6 .erro…

Matplotlib(一)- 数据可视化与Matplotlib

文章目录一、数据可视化1. 数据可视化的概念2. 数据可视化流程3. 数据可视化目的4. 常见的可视化图表4.1 折线图4.2 柱形图4.3 条形图4.4 堆积图4.4.1 堆积面积图4.4.2 堆积柱形图和堆积条形图4.5 直方图4.6 箱形图4.7 饼图4.8 散点图4.9 气泡图4.10 误差棒图4.11 雷达图二、Py…

传输层协议UDP原理

端口号回顾端口号的作用类似pid&#xff0c;用来标识进程的唯一性。只是为了与系统解耦&#xff0c;所以有了端口号。通过ip来确定唯一主机&#xff0c;再通过端口号找到指定的进程。就可以让全网内唯一的两个进程通信了。所以一个完整的报文至少要携带ip和端口号&#xff0c;i…

【牛客刷题】小红的数字删除

文章目录 一、题目介绍1.1 题目描述1.2 输入描述:1.3 输出描述:1.4 示例11.5 示例2二、解题思路2.1 核心观察2.2 关键问题处理三、算法实现四、算法分析4.1 算法流程图4.2 为什么这么设计算法?4.3 算法复杂度五、模拟演练数据示例1: "103252"示例2: "333&quo…

《大数据技术原理与应用》实验报告三 熟悉HBase常用操作

目 录 一、实验目的 二、实验环境 三、实验内容与完成情况 3.1 用Hadoop提供的HBase Shell命令完成以下任务 3.2 现有以下关系型数据库中的表和数据&#xff0c;要求将其转换为适合于HBase存储的表并插入数据&#xff1a; 四、问题和解决方法 五、心得体会 一、实验目的…

微服务初步入门

服务拆分原则 单一职责原则 单一职责原则原本是面向对象设计的一个基本原则&#xff0c;是指一个类应该专注于单一的功能&#xff0c;不要存在多于一个导致类变更的原因 在微服务架构中&#xff0c;是指一个微服务只负责一个功能或者业务领域&#xff0c;每个服务应该由清晰的定…

Liunx操作系统笔记5

用户管理命令&#xff1a; useradd命令&#xff1a; useradd命令的功能是创建并设置用户信息。使用useradd命令可以自动完成用户信息、基本组、家目录等的创建工作&#xff0c;并在创建过程中对用户初始信息进行定制。语法格式:useradd 参数 用户名常用参数: -M 不建立用…

spring-ai-alibaba 接入Tushare查询股票行情

最近spring-ai-alibaba主干分支新增了对Tushare的支持&#xff0c;一起来看看如何使用简单样例老样子&#xff0c;分三步进行&#xff1a;第一步&#xff1a;添加依赖<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-aliba…

Java使用Langchai4j接入AI大模型的简单使用(一)

一、LangChain4j 简介 LangChain4j 是 Java 生态中的 LangChain 实现&#xff0c;是一个用于构建大语言模型(LLM)应用程序的框架。它提供了与各种LLM服务集成的能力&#xff0c;并简化了构建复杂AI应用的过程。 LangChain4j官方文档&#xff1a;Integrations | LangChain4j …

Linux —— A / 基础指令

建议学习路径&#xff1a;Linux系统与系统编程 ⇒ Linux网络和网络编程 ⇒ MySQL一、初识shell命令 1.1、关于 Linux 桌面很多同学的 Linux 启动进⼊图形化的桌⾯. 这个东西⼤家以后就可以忘记了。以后的工作中没有机会使用图形界面。思考: 为什么不使用图形界面? 1.2、下…

[论文阅读] 人工智能 + 软件工程 | 用大语言模型+排名机制,让代码评论自动更新更靠谱

LLMCup&#xff1a;用大语言模型排名机制&#xff0c;让代码评论自动更新更靠谱 LLMCup: Ranking-Enhanced Comment Updating with LLMsarXiv:2507.08671 LLMCup: Ranking-Enhanced Comment Updating with LLMs Hua Ge, Juan Zhai, Minxue Pan, Fusen He, Ziyue Tan Comments: …

悲观锁 乐观锁

悲观锁 乐观锁 在没有加锁的秒杀场景下 每秒打进来的请求是巨大的 高并发场景下 我们发现不仅异常率高的可怕 库存竟然还变成了负数 这产生的结果肯定是很大损失的 那为什么会出现超卖问题呢 我们假设有下面两个线程线程1查询库存&#xff0c;发现库存充足&#xff0c;创建订单…

如何使用Cisco DevNet提供的免费ACI学习实验室(Learning Labs)?(Grok3 回答)

Cisco DevNet 提供的免费 ACI&#xff08;Application Centric Infrastructure&#xff09;学习实验室&#xff08;Learning Labs&#xff09;是帮助用户学习和实践 Cisco ACI 技术&#xff08;包括 APIC 控制器&#xff09;的优秀资源&#xff0c;适合网络工程师、开发者和准备…

Combine的介绍与使用

目录一、Combine 框架介绍二、核心概念三、基础使用示例3.1、创建 Publisher & 订阅3.2、操作符链式调用3.3、Subject 使用&#xff08;手动发送值&#xff09;3.4、网络请求处理3.5、组合多个 Publisher3.6、错误处理四、核心操作符速查表 Operator五、UIKit 绑定示例六、…

【Java笔记】七大排序

目录1. 直接插入排序2. 希尔排序3. 选择排序4. 堆排序(重要)5. 冒泡排序6. 快速排序&#xff08;重要&#xff09;6.1 Hoare 法6.1.1 Hoare 法优化6.2 挖坑法&#xff08;重点&#xff09;6.3 快速排序的非递归写法7. 归并排序海量数据的排序问题8. 总结1. 直接插入排序 时间复…

H.264编解码(NAL)

在我们的日常生活中&#xff0c;比如有缓存电影或者是发送视频的需求。如果没有视频压缩&#xff0c;一部手机只能存几分钟视频&#xff0c;1TB 硬盘也装不下几部电影&#xff0c;用 4G 网络发一段 1 分钟视频&#xff0c;可能需要几十分钟&#xff08;甚至传不完&#xff09;&…

新手向:Python自动化办公批量重命名与整理文件系统

本文将详细介绍如何使用Python实现一个强大的文件批量重命名与整理工具&#xff0c;帮助开发者自动化这一繁琐过程。本教程面向Python初学者&#xff0c;通过一个完整的项目案例&#xff0c;讲解文件系统操作的核心技术。我们将构建的工具将具备以下功能&#xff1a;基于正则表…

C++ 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例

C 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例一、左值右值1.左值2.右值二、左值引用右值引用1.左值引用2.右值引用总结三、integral_constant四、integral_constant的元模板使用案例1.求最大整数2.内存对齐alignof关键字元模板计算内存…