好的,各位观众老爷们,欢迎来到今天的“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
存在时才设置。 就像给房子装修,只有房子存在才能装修。
例子:
-
创建 JSON 对象:
JSON.SET user:1 $ '{"name": "张三", "age": 30, "city": "北京"}'
这条命令会在 Redis 中创建一个键名为
user:1
的 JSON 对象,内容是:{ "name": "张三", "age": 30, "city": "北京" }
是不是很简单?就像搭积木一样,一下子就构建了一个用户的信息。
-
更新 JSON 对象的某个字段:
JSON.SET user:1 $.age 35
这条命令会将
user:1
这个 JSON 对象中的age
字段更新为 35。 再看看现在的user:1
:{ "name": "张三", "age": 35, "city": "北京" }
张三默默地老了五岁… 岁月是把杀猪刀啊!🔪
-
使用
NX
和XX
:JSON.SET product:1 $ '{"name": "苹果", "price": 5.0}' NX # 如果 product:1 不存在,则创建 JSON.SET product:1 $.price 5.5 XX # 如果 product:1 存在,则更新 price
NX
和XX
就像是条件判断,让你更灵活地控制 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 文档的哪个部分。可以指定多个路径,用空格分隔。
例子:
-
获取整个 JSON 对象:
JSON.GET user:1
返回:
"{"name":"张三","age":35,"city":"北京"}"
注意,返回的是一个 JSON 字符串,你需要自己把它解析成 JSON 对象。
-
获取 JSON 对象的某个字段:
JSON.GET user:1 $.name
返回:
""张三""
获取指定字段,省时省力,就像你只想吃苹果,不用把整个水果拼盘都端上来。
-
获取多个字段:
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
: 你要添加到数组末尾的元素,可以添加多个元素,用空格分隔。
例子:
-
在数组末尾添加一个元素:
JSON.SET user:1 $.hobbies '["唱歌", "跳舞"]' JSON.ARRAPPEND user:1 $.hobbies "游泳"
现在
user:1
的hobbies
变成了:["唱歌", "跳舞", "游泳"]
张三的爱好越来越广泛了!
-
在数组末尾添加多个元素:
JSON.ARRAPPEND user:1 $.hobbies "健身" "看电影"
现在
user:1
的hobbies
变成了:["唱歌", "跳舞", "游泳", "健身", "看电影"]
张三简直是个全能选手!💪
注意事项:
- 如果
path
不存在,RedisJSON 会自动创建它,并将其初始化为空数组。 - 如果
path
指向的不是数组,RedisJSON 会报错,就像你试图在一棵树上嫁接一朵花,肯定失败。 JSON.ARRAPPEND
返回的是数组的长度。
实战演练:构建一个简单的在线商店
现在,让我们用 JSON.SET
, JSON.GET
, 和 JSON.ARRAPPEND
来构建一个简单的在线商店,加深对这三个命令的理解。
-
创建商品信息:
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。
-
获取商品信息:
JSON.GET product:1 $.name $.price
返回:
[""iPhone 13"",6999]
我们获取了 iPhone 13 的名称和价格。
-
添加商品标签:
JSON.ARRAPPEND product:1 $.tags "新款"
现在 iPhone 13 的标签变成了:
["手机", "苹果", "新款"]
我们给 iPhone 13 添加了一个 "新款" 标签。
-
模拟用户购买:
假设用户购买了 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 魔法!
下次再见!👋