RedisJSON is a Redis module that implements ECMA-404 The JSON Data Interchange Standard as a native data type. It allows storing, updating and fetching JSON values from Redis keys (documents).
Primary features:
- Full support of the JSON standard
- JSONPath syntax for selecting elements inside documents
- Documents are stored as binary data in a tree structure, allowing fast access to sub-elements
- Typed atomic operations for all JSON values types
- Secondary index support based on RediSearch
Quick start
docker run -p 6379:6379 --name redis-redisjson redislabs/rejson:latest
Documentation
Read the docs at http://redisjson.io
New Commands in RedisJSON
JSON.INDEX ADD <index> <field> <path>
JSON.INDEX DEL <index>
JSON.QGET <index> <query> <path>
<index>- user defined index name<path>- JSONPath syntax for selecting elements inside documents<query>- syntax is based on RediSearch query syntax
Next Milestone
JSON.QSET <index> <query> <path> <json> [NX | XX]
JSON.QDEL <index> <query> <path>
JSON.INDEX DEL <index> <field>
JSON.INDEX INFO <index> <field>
Return value from JSON.QGET is an array of keys and values:
In a language such as Java this could be represented as a Map<String, Document>.
Examples
A query combining multiple paths:
JSON.QGET mytype "@path1:hello @path2:world" d.name
127.0.0.1:6379> json.set user1 $ '{"last":"Joe", "first":"Mc"}' INDEX person OK 127.0.0.1:6379> json.set user2 $ '{"last":"Joan", "first":"Mc"}' INDEX person OK 127.0.0.1:6379> json.index add person last $.last OK 127.0.0.1:6379> JSON.QGET person Jo* "{\"user2\":[{\"last\":\"Joan\",\"first\":\"Mc\"}],\"user1\":[{\"last\":\"Joe\",\"first\":\"Mc\"}]}" 127.0.0.1:6379> json.set user3 $ '{"last":"Joel", "first":"Dan"}' INDEX person OK 127.0.0.1:6379> JSON.QGET person Jo* "{\"user2\":[{\"last\":\"Joan\",\"first\":\"Mc\"}],\"user1\":[{\"last\":\"Joe\",\"first\":\"Mc\"}],\"user3\":[{\"last\":\"Joel\",\"first\":\"Dan\"}]}" 127.0.0.1:6379> json.index add person first $.first OK 127.0.0.1:6379> JSON.QGET person Mc "{\"user2\":[{\"last\":\"Joan\",\"first\":\"Mc\"}],\"user1\":[{\"last\":\"Joe\",\"first\":\"Mc\"}]}" 127.0.0.1:6379> JSON.QGET person Mc $.last "{\"user2\":[\"Joan\"],\"user1\":[\"Joe\"]}" 127.0.0.1:6379> JSON.QGET person "@last:Jo* @first:Mc" $.last "{\"user2\":[\"Joan\"],\"user1\":[\"Joe\"]}"
Build
Make sure you have Rust installed: https://www.rust-lang.org/tools/install
Then, build as usual:
Run
Linux
redis-server --loadmodule ./target/release/librejson.so
Mac OS
redis-server --loadmodule ./target/release/librejson.dylib
Client libraries
Some languages have client libraries that provide support for RedisJSON's commands:
| Project | Language | License | Author | Stars | Package |
|---|---|---|---|---|---|
| iorejson | Node.js | MIT | Evan Huang @evanhuang8 | npm | |
| node_redis-rejson | Node.js | MIT | Kyle Davis @stockholmux | npm | |
| redis-modules-sdk | Node.js | BSD-3-Clause | Dani Tseitlin @danitseitlin | npm | |
| JRedisJSON | Java | BSD-2-Clause | Redis Labs | maven | |
| redisjson-py | Python | BSD-2-Clause | Redis Labs | pypi | |
| go-rejson | Go | MIT | Nitish Malhotra @nitishm | ||
| rejonson | Go | Apache-2.0 | Daniel Krom @KromDaniel | ||
| NReJSON | .NET | MIT/Apache-2.0 | Tommy Hanks @tombatron | nuget | |
| phpredis-json | PHP | MIT | Rafa Campoy @averias | composer | |
| redislabs-rejson | PHP | MIT | Mehmet Korkmaz @mkorkmaz | composer | |
| rejson-rb | Ruby | MIT | Pavan Vachhani @vachhanihpavan | rubygems |
Acknowledgements
RedisJSON is developed with <3 at Redis Labs.
RedisJSON is made possible only because of the existance of this amazing open source project:
License
Redis Source Available License Agreement - see LICENSE