请选择 进入手机版 | 继续访问电脑版

Redis中国用户组(CRUG)论坛

 找回密码
 立即注册

扫一扫,访问微社区

搜索
热搜: 活动 交友 discuz
查看: 1581|回复: 0

【独家】Redis支持JSON数据类型?

[复制链接]

该用户从未签到

2

主题

2

帖子

38

积分

新手上路

Rank: 1

积分
38
发表于 2017-7-7 20:18:55 | 显示全部楼层 |阅读模式
作者/翻译:张冬洪,Redis中国用户组主席

ReJSON介绍
ReJSON 是一个Redis Module,它实现了ECMA-404 The JSON Data Interchange Standard作为本地数据类型。它允许从Redis Keys(documents)中存储,更新和获取JSON值。

主要特性:
  • 完全支持JSON标准
  • 对于在文档内选择元素类似JSONPath语法
  • 文档作为二进制数据被存储在一个树形结构中,允许快速访问子元素
  • 对所有JSON数据类型按照原子操作进行分类


ReJSON 是有Redis Labs开发的,源码下载地址是https://github.com/RedisLabsModules/ReJSON

Demo 演示

编译Module
Linux Ubuntu 16.04

依赖:

为了编译这个module,需要在项目目录下执行 make 命令
恭喜!你可以找到这个编译后的模块库文件在src/rejson.so下。
MaxOSX

为了编译这个module,需要在项目目录下执行 make 命令
恭喜!你可以找到这个编译后的模块库文件在src/rejson.so下。


加载Module进Redis
依赖:
  • Redis V4.0 或更高版本


我们推荐你使用下面的方式来加载module到redis,即在启动的过程中,添加下面的一行内容到 redis.conf 文件中:
loadmodule /path/to/module/rejson.so

用ReJSON module 库文件的真实路径替换上面的这行/path/to/module/rejson.so
或者,你也可以使用下面命令行参数语法来加载module:
~/$ redis-server --loadmodule /path/to/module/rejson.so

最后,你还可以使用MODULE LOAD命令。注意,然而,这个MODULE LOAD是一个危险命令,将来出于安全考虑或许会被封锁或者取消。
一旦module被加载成功,Redis log中应该会出现下面类似的行:
...1877:M 23 Dec 02:02:59.725 # <ReJSON> JSON data type for Redis - v1.0.0 [encver 0]1877:M 23 Dec 02:02:59.725 * Module 'ReJSON' loaded from <redacted>/src/rejson.so...
使用ReJSON
开始使用ReJSON之前,你应该非常熟悉它的命令和语法,详细信息参考commands reference文档。然而,为了快速开始使用,只需要看本文就能了解:
  • 一个运行包含该module的Redis server(看编译和加载来指导)
  • 任何Redis 或 ReJSON 客户端

用redis-cli

这个例子将使用 redis-cli 作为Redis客户端。第一个来试用的ReJSON命令是 JSON.SET,用一个JSON value 设置一个 Redis key。所有的JSON values都能被使用,例如一个string:
127.0.0.1:6379> JSON.SET foo . '"bar"'OK127.0.0.1:6379> JSON.GET foo"\"bar\""127.0.0.1:6379> JSON.TYPE foo .string

JSON.GET 和 JSON.TYPE都能进行迭代而不管values的类型,但是你真的应该看看JSON.GET的美化能力。请注意这些命令是如何给出句点符号的,例如:. 。这是在ReJSON数据类型的value的路径(在这种情况下,它只是意味着root)。两个字符串操作:
127.0.0.1:6379> JSON.STRLEN foo .3127.0.0.1:6379> JSON.STRAPPEND foo . '"baz"'6127.0.0.1:6379> JSON.GET foo"\"barbaz\""

JSON.STRLEN告诉你这个字符串的长度,并且你可以用JSON.STRAPPEND 命令给它追加其他的字符串。数字可以增加或者相乘:
127.0.0.1:6379> JSON.SET num . 0OK127.0.0.1:6379> JSON.NUMINCRBY num . 1"1"127.0.0.1:6379> JSON.NUMINCRBY num . 1.5"2.5"127.0.0.1:6379> JSON.NUMINCRBY num . -0.75"1.75"127.0.0.1:6379> JSON.NUMMULTBY num . 24"42"

当然,更有趣的例子将会包括一个数组或者也许是一个对象:
127.0.0.1:6379> JSON.SET amoreinterestingexample . '[ true, { "answer": 42 }, null ]'OK127.0.0.1:6379> JSON.GET amoreinterestingexample"[true,{\"answer\":42},null]"127.0.0.1:6379> JSON.GET amoreinterestingexample [1].answer"42"127.0.0.1:6379> JSON.DEL amoreinterestingexample [-1]1127.0.0.1:6379> JSON.GET amoreinterestingexample"[true,{\"answer\":42}]"

非常方便的用 JSON.DEL 命令来删除你告诉它要处理的。数组能够被操作用一个专用的ReJSON 命令子集:
127.0.0.1:6379> JSON.SET arr . []OK127.0.0.1:6379> JSON.ARRAPPEND arr . 0(integer) 1127.0.0.1:6379> JSON.GET arr"[0]"127.0.0.1:6379> JSON.ARRINSERT arr . 0 -2 -1(integer) 3127.0.0.1:6379> JSON.GET arr"[-2,-1,0]"127.0.0.1:6379> JSON.ARRTRIM arr . 1 11127.0.0.1:6379> JSON.GET arr"[-1]"127.0.0.1:6379> JSON.ARRPOP arr"-1"127.0.0.1:6379> JSON.ARRPOP arr(nil)
对象也有它们自己的命令:
127.0.0.1:6379> JSON.SET obj . '{"name":"Leonard Cohen","lastSeen":1478476800,"loggedOut": true}'OK127.0.0.1:6379> JSON.OBJLEN obj .(integer) 3127.0.0.1:6379> JSON.OBJKEYS obj .1) "name"2) "lastSeen"3) "loggedOut"
用任何其他的客户端

除非你的Redis 客户端已经支持Redis modules(不大可能)或者 特殊的ReJSON客户端(更不可能),你应该可以使用其发送原始Redis命令的能力,取决于你选择的客户端,做这件事的确切方法可能会有所不同。

Python 例子:

这个代码片段演示如何使用redis-py 客户端从Python中用原始Redis 命令应用ReJSON:
import redis
import json

data = {    'foo': 'bar'
}

r = redis.StrictRedis()
r.execute_command('JSON.SET', 'doc', '.', json.dumps(data))
reply = json.loads(r.execute_command('JSON.GET', 'doc'))
客户端
一些语言有客户端库对ReJSON的命令提供支持:


本文由Redis中国用户组翻译团队翻译整理,投稿或加入我们请联系crug@redis.cn。请关注Redis中国用户组公众号:rediscn
                        长按二维码关注最新动态




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Redis中国用户组 ( 京ICP备15003959号

GMT+8, 2019-10-16 13:08 , Processed in 0.088038 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表