前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis Stack 技术栈之JSON数据模型 RedisJSON

Redis Stack 技术栈之JSON数据模型 RedisJSON

作者头像
Tinywan
发布2023-12-19 17:11:38
3000
发布2023-12-19 17:11:38
举报
文章被收录于专栏:开源技术小栈开源技术小栈

简介

RedisJSON是RedisLabs公司开发的一款用于扩展Redis的JSON处理模块,能够让Redis像处理其他类型键一样处理JSON格式的数据,相当于扩展了Redis的数据类型。

Redis版本

Redis 4.0 以后提供了模块功能,能够让开发者基于开放的 API 来扩展Redis自身的功能,因此要想使用Redis的模块功能,至少要求Redis 4.0及以上版本。

特点

  1. 完全支持JSON标准
  2. 使用类似JSONPath的语法,用于在文档中选择元素
  3. 文档以二进制数据的形式存储在树结构中,允许快速访问子元素
  4. 所有JSON值类型都是原子操作

命令

官方命令

官方命令:https://redis.io/commands/?group=json&name=JSON

命令规范

  1. 命令和子命令的名称是大写的,例如JSON.SETINDENT
  2. 强制参数用尖括号括起来,例如<path>
  3. 可选参数用方括号括起来,例如[index]
  4. 其他可选参数由三个句点字符表示,即...
  5. 管道字符|表示异或

基础命令

设置JSON值
代码语言:javascript
复制
JSON.SET <key> <path> <json> [NX | XX]

说明:

  • NX: 如果不存在就添加
  • XX: 如果存在就更新
查询KEY语法
代码语言:javascript
复制
JSON.GET <key> [INDENT indentation-string] [NEWLINE line-break-string] [SPACE space-string] [path ...]

说明:

  • [path ...] 可以接受多个path,默认是root
  • INDENT: 设置嵌套级别
  • NEWLINE: 每行末尾打印的字符串
  • SPACE: 设置keyvalue之间的字符串
代码语言:javascript
复制
JSON.GET Tinywan INDENT "\t" NEWLINE "\n" SPACE " " .

JSON.SET doc $ '{"a":2, "b": 3, "nested": {"a": 4, "b": null}}'
JSON.GET doc $..b
JSON.GET doc ..a $..b

查询指定路径下的多个key,不存在的key或path返回null

代码语言:javascript
复制
JSON.MGET <key> [key ...] <path>

JSON.SET doc1 $ '{"a":1, "b": 2, "nested": {"a": 3}, "c": null}'
JSON.SET doc2 $ '{"a":4, "b": 5, "nested": {"a": 6}, "c": null}'

JSON.MGET doc1 doc2 $..a
删除值
代码语言:javascript
复制
JSON.DEL <key> [path]

说明:

  • 不存在的keypath会被忽略
  • 返回integer

字符串

代码语言:javascript
复制
# 添加
127.0.0.1:6379> JSON.SET username . '"Tinywan"'
OK

# 查询
127.0.0.1:6379> JSON.GET username
"\"Tinywan\""

# 类型
127.0.0.1:6379> JSON.TYPE username
"string"

# 字符串长度
127.0.0.1:6379> JSON.STRLEN username
(integer) 7

# 字符串追加
127.0.0.1:6379> JSON.STRAPPEND username . '"2024"'
(integer) 11

# 获取追加字符串
127.0.0.1:6379> JSON.GET username
"\"Tinywan2024\""
127.0.0.1:6379>

数字

代码语言:javascript
复制
# 添加TinywanNum
127.0.0.1:6379> JSON.SET TinywanNum . 0
OK

# TinywanNum 加1
127.0.0.1:6379> JSON.NUMINCRBY TinywanNum . 1
"1"

# TinywanNum 加 10.5
127.0.0.1:6379> JSON.NUMINCRBY TinywanNum . 10.5
"11.5"

# TinywanNum 减 5.5
127.0.0.1:6379> JSON.NUMINCRBY TinywanNum . -5.5
"6.0"

# TinywanNum 乘 100
127.0.0.1:6379> JSON.NUMMULTBY TinywanNum . 100
"600.0"

# 查询TinywanNum
127.0.0.1:6379> JSON.GET TinywanNum
"600.0"

JSON数据

代码语言:javascript
复制
# 添加json字符串resty
127.0.0.1:6379> JSON.SET resty . '{"name":"Tinywan","age":24}'
OK

# 查询
127.0.0.1:6379> JSON.GET resty
"{\"name\":\"Tinywan\",\"age\":24}"

# 数据类型
127.0.0.1:6379> JSON.TYPE resty
"object"

# 数据元素个数
127.0.0.1:6379> JSON.OBJLEN resty
(integer) 2

# 所有的key
127.0.0.1:6379> JSON.OBJKEYS resty
1) "name"
2) "age"

数组

代码语言:javascript
复制
# 添加空数组
127.0.0.1:6379> JSON.SET TinywanArr . []
OK

# 查询
127.0.0.1:6379> JSON.GET TinywanArr
"[]"

# 追加数据
127.0.0.1:6379> JSON.ARRAPPEND TinywanArr . false
(integer) 1
127.0.0.1:6379> JSON.ARRAPPEND TinywanArr . '{"wechat":2028}'
(integer) 2
127.0.0.1:6379> JSON.ARRAPPEND TinywanArr . null
(integer) 3

# 获取追加数据数组
127.0.0.1:6379> JSON.GET TinywanArr
"[false,{\"wechat\":2028},null]"

# 查询数组某个元素
127.0.0.1:6379> JSON.GET TinywanArr . [1].wechat
"{\".\":[false,{\"wechat\":2028},null],\"[1].wechat\":2028}"

# 查询
127.0.0.1:6379> JSON.GET TinywanArr
"[false,{\"wechat\":2028},null]"

# 查询数组某个元素
127.0.0.1:6379> JSON.GET TinywanArr [1].wechat
"2028"

# 删除最后一个元素
127.0.0.1:6379> JSON.DEL TinywanArr [-1]
(integer) 1
127.0.0.1:6379> JSON.GET TinywanArr
"[false,{\"wechat\":2028}]"

# 指定位置插入数据
127.0.0.1:6379> JSON.ARRINSERT TinywanArr . 0 -20 -100
(integer) 4
127.0.0.1:6379> JSON.GET TinywanArr
"[-20,-100,false,{\"wechat\":2028}]"

# 删除元素,只保留指定范围的元素
127.0.0.1:6379> JSON.ARRTRIM TinywanArr . 2 3
(integer) 2
127.0.0.1:6379> JSON.GET TinywanArr
"[false,{\"wechat\":2028}]"

# 获取数据并删除
127.0.0.1:6379> JSON.ARRPOP TinywanArr
"{\"wechat\":2028}"
127.0.0.1:6379> JSON.ARRPOP TinywanArr
"false"
127.0.0.1:6379> JSON.ARRPOP TinywanArr
(nil)

PHP 来操作 RedisJson

RedisJSON-PHP为Redislabs的ReJSON Module for PHP提供了一个客户端。这个库支持广泛使用的redis客户端(PECL Redis Extension和Predis)。

安装依赖包

代码语言:javascript
复制
composer require mkorkmaz/redislabs-rejson

使用

以下以PECL Redis扩展为示例

代码语言:javascript
复制
$redisClient = new \Redis();
$redisClient->connect('192.168.13.168',63789);
$reJSON = \Redislabs\Module\ReJSON\ReJSON::createWithPhpRedis($redisClient);
$res = $reJSON->set('Tinywan', '.', ['username'=>'Tinywan','age'=>25], 'NX');

依赖包基本支持了所有RedisJSON操作命令

官方更多的客户端 https://github.com/RedisJSON/RedisJSON

RedisJson 性能

官网也给了一个性能测试报告,可谓碾压其他 NoSQL,下面是核心的报告结论:

  • 隔离写入(isolated writes):RedisJSON 比 MongoDB5.4 倍,比 ElasticSearch200 倍以上。
  • 隔离读取(isolated reads):RedisJSON 比 MongoDB12.7 倍,比 ElasticSearch500 倍以上。

在混合工作负载场景中,实时更新不会影响 RedisJSON 的搜索和读取性能,而 ElasticSearch 会受到影响。以下是具体的数据:

  • RedisJSON* 支持的操作数/秒比 MongoDB 高约 50 倍,比 ElasticSearch 高 7 倍/秒。
  • RedisJSON* 的延迟比 MongoDB 低约 90 倍,比 ElasticSearch23.7 倍。

此外,RedisJSON 的读取、写入和负载搜索延迟在更高的百分位数中远比 ElasticSearchMongoDB 稳定。当增加写入比率时,RedisJSON 还能处理越来越高的整体吞吐量,而当写入比率增加时,ElasticSearch 会降低它可以处理的整体吞吐量。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
    • Redis版本
      • 特点
      • 命令
        • 基础命令
          • 设置JSON值
          • 查询KEY语法
          • 删除值
        • 字符串
          • 数字
            • JSON数据
              • 数组
              • PHP 来操作 RedisJson
                • 安装依赖包
                  • 使用
                    • 依赖包基本支持了所有RedisJSON操作命令
                    • RedisJson 性能
                    相关产品与服务
                    云数据库 Redis
                    腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档