RedisJSON 的 `JSON.SET`, `JSON.GET`, `JSON.ARRAPPEND` 等命令详解

好的,各位观众老爷们,欢迎来到今天的“RedisJSON 魔法学院”!我是你们的特邀讲师,江湖人称“键值对小王子”,今天咱们要聊聊 RedisJSON 这个宝贝,特别是它那几个让人爱不释手的命令:JSON.SET, JSON.GET, 和 JSON.ARRAPPEND

准备好了吗?咱们这就开始,一起揭开 RedisJSON 的神秘面纱!🧙‍♂️

开场白:Redis 与 JSON 的甜蜜邂逅

各位都知道,Redis 擅长速度,就像猎豹一样快,但它原本是个朴素的键值对数据库,只能存储简单的字符串。这就像让你用一把瑞士军刀去雕刻艺术品,有点勉为其难。

JSON 呢?它擅长表达复杂的数据结构,像一个灵活的魔方,可以把各种信息塞进一个小盒子里。但是,如果 JSON 数据太大,或者你需要频繁地修改其中的一部分,传统的字符串存储方式效率就有点捉襟见肘了。

于是,英雄救美的故事发生了!RedisJSON 横空出世,它让 Redis 拥有了存储和操作 JSON 数据的能力,就像给猎豹装上了翅膀,让瑞士军刀变成了变形金刚!🚀

第一幕:JSON.SET – 赋予 JSON 生命

JSON.SET 命令是 RedisJSON 的基石,它的作用就像女娲造人,赋予 JSON 数据在 Redis 中存在的意义。

语法:

JSON.SET key path value [NX|XX]
  • key: 不用多说,就是 Redis 的键名,你的 JSON 数据会以这个名字安家落户。
  • path: JSON 路径,指定你要设置的 JSON 文档的哪个部分。$ 代表根路径,也就是整个 JSON 文档。
  • value: 你要设置的 JSON 值,可以是字符串、数字、布尔值、数组、对象等等。
  • NX: 可选参数,表示 "Not eXists",只有当 key 不存在时才设置。就像相亲,如果对方已经名花有主,你就没机会了。
  • XX: 可选参数,表示 "eXists",只有当 key 存在时才设置。 就像给房子装修,只有房子存在才能装修。

例子:

  1. 创建 JSON 对象:

    JSON.SET user:1 $ '{"name": "张三", "age": 30, "city": "北京"}'

    这条命令会在 Redis 中创建一个键名为 user:1 的 JSON 对象,内容是:

    {
      "name": "张三",
      "age": 30,
      "city": "北京"
    }

    是不是很简单?就像搭积木一样,一下子就构建了一个用户的信息。

  2. 更新 JSON 对象的某个字段:

    JSON.SET user:1 $.age 35

    这条命令会将 user:1 这个 JSON 对象中的 age 字段更新为 35。 再看看现在的 user:1

    {
      "name": "张三",
      "age": 35,
      "city": "北京"
    }

    张三默默地老了五岁… 岁月是把杀猪刀啊!🔪

  3. 使用 NXXX

    JSON.SET product:1 $ '{"name": "苹果", "price": 5.0}' NX  # 如果 product:1 不存在,则创建
    JSON.SET product:1 $.price 5.5 XX  # 如果 product:1 存在,则更新 price

    NXXX 就像是条件判断,让你更灵活地控制 JSON 数据的创建和更新。

注意事项:

  • JSON.SET 是一个原子操作,也就是说,要么整个 JSON 对象设置成功,要么失败,不会出现中间状态。
  • 如果 path 不存在,RedisJSON 会自动创建它,就像在你家花园里种花,如果没花盆,它会帮你挖一个坑。
  • 如果 value 不是合法的 JSON 格式,RedisJSON 会报错,就像你试图把砖头塞进魔方里,肯定行不通。

第二幕:JSON.GET – 获取 JSON 的灵魂

JSON.GET 命令是 RedisJSON 的眼睛,它可以让你看到存储在 Redis 中的 JSON 数据。

语法:

JSON.GET key [path ...]
  • key: 你要获取 JSON 数据的键名。
  • path: 可选参数,JSON 路径,指定你要获取的 JSON 文档的哪个部分。可以指定多个路径,用空格分隔。

例子:

  1. 获取整个 JSON 对象:

    JSON.GET user:1

    返回:

    "{"name":"张三","age":35,"city":"北京"}"

    注意,返回的是一个 JSON 字符串,你需要自己把它解析成 JSON 对象。

  2. 获取 JSON 对象的某个字段:

    JSON.GET user:1 $.name

    返回:

    ""张三""

    获取指定字段,省时省力,就像你只想吃苹果,不用把整个水果拼盘都端上来。

  3. 获取多个字段:

    JSON.GET user:1 $.name $.age

    返回:

    [""张三"",35]

    一次获取多个字段,就像你去超市购物,一次把需要的商品都放进购物车。

注意事项:

  • 如果 key 不存在,JSON.GET 返回 nil
  • 如果 path 不存在,JSON.GET 返回 nil
  • 可以指定多个 path,但如果其中一个 path 不存在,不会影响其他 path 的获取。

第三幕:JSON.ARRAPPEND – 为数组注入活力

JSON.ARRAPPEND 命令是 RedisJSON 的画笔,它可以让你在 JSON 数组的末尾添加元素,就像给一幅画添上几笔,让它更加完整。

语法:

JSON.ARRAPPEND key path value [value ...]
  • key: 你要操作的 JSON 对象的键名。
  • path: JSON 路径,指定你要操作的 JSON 数组。
  • value: 你要添加到数组末尾的元素,可以添加多个元素,用空格分隔。

例子:

  1. 在数组末尾添加一个元素:

    JSON.SET user:1 $.hobbies '["唱歌", "跳舞"]'
    JSON.ARRAPPEND user:1 $.hobbies "游泳"

    现在 user:1hobbies 变成了:

    ["唱歌", "跳舞", "游泳"]

    张三的爱好越来越广泛了!

  2. 在数组末尾添加多个元素:

    JSON.ARRAPPEND user:1 $.hobbies "健身" "看电影"

    现在 user:1hobbies 变成了:

    ["唱歌", "跳舞", "游泳", "健身", "看电影"]

    张三简直是个全能选手!💪

注意事项:

  • 如果 path 不存在,RedisJSON 会自动创建它,并将其初始化为空数组。
  • 如果 path 指向的不是数组,RedisJSON 会报错,就像你试图在一棵树上嫁接一朵花,肯定失败。
  • JSON.ARRAPPEND 返回的是数组的长度。

实战演练:构建一个简单的在线商店

现在,让我们用 JSON.SET, JSON.GET, 和 JSON.ARRAPPEND 来构建一个简单的在线商店,加深对这三个命令的理解。

  1. 创建商品信息:

    JSON.SET product:1 $ '{"name": "iPhone 13", "price": 6999, "stock": 100, "tags": ["手机", "苹果"]}'
    JSON.SET product:2 $ '{"name": "iPad Pro", "price": 7999, "stock": 50, "tags": ["平板", "苹果"]}'

    我们创建了两个商品,分别是 iPhone 13 和 iPad Pro。

  2. 获取商品信息:

    JSON.GET product:1 $.name $.price

    返回:

    [""iPhone 13"",6999]

    我们获取了 iPhone 13 的名称和价格。

  3. 添加商品标签:

    JSON.ARRAPPEND product:1 $.tags "新款"

    现在 iPhone 13 的标签变成了:

    ["手机", "苹果", "新款"]

    我们给 iPhone 13 添加了一个 "新款" 标签。

  4. 模拟用户购买:

    假设用户购买了 2 台 iPhone 13,我们需要更新库存:

    -- 这里需要用到 Redis 的事务和 Lua 脚本,才能保证原子性
    -- 因为 RedisJSON 本身没有提供直接修改数值的命令
    EVAL "local stock = redis.call('JSON.GET', KEYS[1], ARGV[1]); stock = tonumber(stock) - tonumber(ARGV[2]); redis.call('JSON.SET', KEYS[1], ARGV[1], stock); return stock" 1 product:1 $.stock 2

    这段 Lua 脚本会原子性地减少 iPhone 13 的库存。

总结:RedisJSON 的无限可能

JSON.SET, JSON.GET, 和 JSON.ARRAPPEND 只是 RedisJSON 的冰山一角,它还提供了许多其他强大的命令,比如 JSON.DEL, JSON.NUMINCRBY, JSON.STRAPPEND 等等。

RedisJSON 的出现,让 Redis 不再只是一个简单的键值对数据库,而是一个功能强大的 JSON 文档数据库,可以应用于各种场景,比如:

  • 缓存 JSON 数据: 将 API 返回的 JSON 数据缓存到 Redis 中,提高访问速度。
  • 存储用户配置: 将用户的个性化配置存储为 JSON 对象,方便读取和修改。
  • 构建全文索引: 结合 RedisSearch,可以对 JSON 文档进行全文搜索。
  • 实时数据分析: 将实时数据存储为 JSON 对象,并使用 Redis 的流式处理功能进行分析。

总之,RedisJSON 的潜力是无限的,只要你敢想,就能用它创造出各种奇妙的应用!

尾声:魔法学院的毕业典礼

恭喜各位学员,成功完成了 RedisJSON 魔法学院的课程!希望今天的学习能让大家对 RedisJSON 有更深入的了解。

记住,魔法的强大在于运用,希望大家多多实践,创造出属于自己的 RedisJSON 魔法!

下次再见!👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注