doc: 阅读RedisJSON文档
This commit is contained in:
@@ -22,6 +22,24 @@
|
|||||||
- [WATCH](#watch)
|
- [WATCH](#watch)
|
||||||
- [UNWATCH](#unwatch)
|
- [UNWATCH](#unwatch)
|
||||||
- [Using WATCH to implement ZPOP](#using-watch-to-implement-zpop)
|
- [Using WATCH to implement ZPOP](#using-watch-to-implement-zpop)
|
||||||
|
- [Data Types](#data-types)
|
||||||
|
- [Redis Strings](#redis-strings)
|
||||||
|
- [SET / GET](#set--get)
|
||||||
|
- [set with additional arguments](#set-with-additional-arguments)
|
||||||
|
- [GETSET](#getset)
|
||||||
|
- [MSET / MGET](#mset--mget)
|
||||||
|
- [strings as counters](#strings-as-counters)
|
||||||
|
- [Limits](#limits)
|
||||||
|
- [JSON](#json)
|
||||||
|
- [`JSON.SET`](#jsonset)
|
||||||
|
- [json数值操作](#json数值操作)
|
||||||
|
- [json数组操作](#json数组操作)
|
||||||
|
- [`JSON.DEL`](#jsondel)
|
||||||
|
- [`JSON.ARRAPPEND`](#jsonarrappend)
|
||||||
|
- [`JSON.ARRTRIM`](#jsonarrtrim)
|
||||||
|
- [json object操作](#json-object操作)
|
||||||
|
- [format output](#format-output)
|
||||||
|
- [Limitation](#limitation)
|
||||||
|
|
||||||
|
|
||||||
# redis
|
# redis
|
||||||
@@ -357,6 +375,8 @@ EXEC
|
|||||||
|
|
||||||
在`EXEC`命令被调用后,所有的watched keys都会被`unwatched`,不管事务是否被aborted。并且,当client连接关闭后,所有keys都会被unwatched。
|
在`EXEC`命令被调用后,所有的watched keys都会被`unwatched`,不管事务是否被aborted。并且,当client连接关闭后,所有keys都会被unwatched。
|
||||||
|
|
||||||
|
对于`discard`命令,其在调用后所有watched keys也会自动被`unwatched`。
|
||||||
|
|
||||||
#### UNWATCH
|
#### UNWATCH
|
||||||
可以通过`UNWATCH`命令(无参数)来清空所有的watched keys。
|
可以通过`UNWATCH`命令(无参数)来清空所有的watched keys。
|
||||||
|
|
||||||
@@ -375,3 +395,197 @@ MULTI
|
|||||||
ZREM zset element
|
ZREM zset element
|
||||||
EXEC
|
EXEC
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> 如果`EXEC失败,那么其将返回Null`,所以仅需对之前操作进行重试即可
|
||||||
|
|
||||||
|
## Data Types
|
||||||
|
### Redis Strings
|
||||||
|
Redis strings存储字节序列,包含文本、serialized objects、binary array。strings通常被用于缓存,但是支持额外的功能,例如counters和位操作。
|
||||||
|
|
||||||
|
redis keys也为strings。
|
||||||
|
|
||||||
|
string data type可用于诸多用例,例如对html fragement/html page的缓存。
|
||||||
|
|
||||||
|
#### SET / GET
|
||||||
|
通过set和get命令,可以对string value进行设置和获取。
|
||||||
|
```redis-cli
|
||||||
|
> SET bike:1 Deimos
|
||||||
|
OK
|
||||||
|
> GET bike:1
|
||||||
|
"Deimos"
|
||||||
|
```
|
||||||
|
|
||||||
|
在使用`SET`命令时,如果key已存在对应的值,那么set指定的value将会对已经存在的值进行替换。`即使key对应的旧值并不是strings类型,set也会对其进行替换`。
|
||||||
|
|
||||||
|
values可以是`strings of every kind`(包含binary data),故而支持在value中存储jpeg image。value的值不能超过512MB.
|
||||||
|
|
||||||
|
#### set with additional arguments
|
||||||
|
在使用`set`命令时,可以为其提供额外的参数,例如`NX | XX`.
|
||||||
|
|
||||||
|
- `NX`: 仅当redis不存在对应的key时才进行设置,否则失败(返回nil)
|
||||||
|
- `XX`: 仅当redis存在对应的key时的才进行设置,否则失败(返回nil)
|
||||||
|
|
||||||
|
#### GETSET
|
||||||
|
GETSET命令将会将key设置为指定的new value,并且返回oldvalue的值。
|
||||||
|
|
||||||
|
```redis-cli
|
||||||
|
127.0.0.1:6379> get bike:1
|
||||||
|
(nil)
|
||||||
|
127.0.0.1:6379> GETSET bike:1 3
|
||||||
|
(nil)
|
||||||
|
127.0.0.1:6379> GET bike:1
|
||||||
|
"3"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### MSET / MGET
|
||||||
|
strings类型支持通过`mset, mget`命令来一次性获取和设置多个keys,这将能降低RTT带来的延迟。
|
||||||
|
```redis-cli
|
||||||
|
> mset bike:1 "Deimos" bike:2 "Ares" bike:3 "Vanth"
|
||||||
|
OK
|
||||||
|
> mget bike:1 bike:2 bike:3
|
||||||
|
1) "Deimos"
|
||||||
|
2) "Ares"
|
||||||
|
3) "Vanth"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### strings as counters
|
||||||
|
strings类型支持atomic increment:
|
||||||
|
```redis-cli
|
||||||
|
> set total_crashes 0
|
||||||
|
OK
|
||||||
|
> incr total_crashes
|
||||||
|
(integer) 1
|
||||||
|
> incrby total_crashes 10
|
||||||
|
(integer) 11
|
||||||
|
```
|
||||||
|
`incr`命令会将string value转化为integer,并且对其进行加一操作。类似命令还有`incrby, decr, drcrby`。
|
||||||
|
|
||||||
|
#### Limits
|
||||||
|
默认情况下,单个redis string的最大限制为`512MB`。
|
||||||
|
|
||||||
|
### JSON
|
||||||
|
redis支持对json值的存储、更新和获取。redis json可以和redis query engine进行协作,从而允许`index and query json documents`。
|
||||||
|
|
||||||
|
> 在redis 8中内置支持了RedisJSON,否则需要手动安装RedisJSON module。
|
||||||
|
|
||||||
|
#### `JSON.SET`
|
||||||
|
`JSON.SET`命令支持将redis的key设置为JSON value,示例如下:
|
||||||
|
```redis-cli
|
||||||
|
127.0.0.1:6379> JSON.SET bike $ '"Hyperion"'
|
||||||
|
OK
|
||||||
|
127.0.0.1:6379> JSON.GET bike $
|
||||||
|
"[\"Hyperion\"]"
|
||||||
|
127.0.0.1:6379> type bike
|
||||||
|
ReJSON-RL
|
||||||
|
127.0.0.1:6379> JSON.TYPE bike $
|
||||||
|
1) "string"
|
||||||
|
```
|
||||||
|
|
||||||
|
在上述示例中,`$`代表的是指向json document中value的`path`:
|
||||||
|
- 在上述示例中,`$`代表root
|
||||||
|
|
||||||
|
除此之外,JSON还支持其他string operation。`JSON.STRLNE`支持获取string长度,并且可以通过`JSON.STRAPPEND`来在当前字符串后追加其他字符串:
|
||||||
|
```redis-cli
|
||||||
|
> JSON.STRLEN bike $
|
||||||
|
1) (integer) 8
|
||||||
|
> JSON.STRAPPEND bike $ '" (Enduro bikes)"'
|
||||||
|
1) (integer) 23
|
||||||
|
> JSON.GET bike $
|
||||||
|
"[\"Hyperion (Enduro bikes)\"]"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### json数值操作
|
||||||
|
RedisJSON支持`increment`和`multiply`操作:
|
||||||
|
```redis-cli
|
||||||
|
> JSON.SET crashes $ 0
|
||||||
|
OK
|
||||||
|
> JSON.NUMINCRBY crashes $ 1
|
||||||
|
"[1]"
|
||||||
|
> JSON.NUMINCRBY crashes $ 1.5
|
||||||
|
"[2.5]"
|
||||||
|
> JSON.NUMINCRBY crashes $ -0.75
|
||||||
|
"[1.75]"
|
||||||
|
> JSON.NUMMULTBY crashes $ 24
|
||||||
|
"[42]"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### json数组操作
|
||||||
|
RedisJSON支持通过`JSON.SET`将值赋值为数组,`path expression`支持数组操作
|
||||||
|
```redis-cli
|
||||||
|
> JSON.SET newbike $ '["Deimos", {"crashes": 0}, null]'
|
||||||
|
OK
|
||||||
|
> JSON.GET newbike $
|
||||||
|
"[[\"Deimos\",{\"crashes\":0},null]]"
|
||||||
|
> JSON.GET newbike $[1].crashes
|
||||||
|
"[0]"
|
||||||
|
> JSON.DEL newbike $[-1]
|
||||||
|
(integer) 1
|
||||||
|
> JSON.GET newbike $
|
||||||
|
"[[\"Deimos\",{\"crashes\":0}]]"
|
||||||
|
```
|
||||||
|
|
||||||
|
##### `JSON.DEL`
|
||||||
|
`JSON.DEL`支持通过`path`对json值进行删除。
|
||||||
|
|
||||||
|
##### `JSON.ARRAPPEND`
|
||||||
|
支持向json array中追加值。
|
||||||
|
|
||||||
|
##### `JSON.ARRTRIM`
|
||||||
|
支持对json array进行裁剪。
|
||||||
|
|
||||||
|
```redis-cli
|
||||||
|
> JSON.SET riders $ []
|
||||||
|
OK
|
||||||
|
> JSON.ARRAPPEND riders $ '"Norem"'
|
||||||
|
1) (integer) 1
|
||||||
|
> JSON.GET riders $
|
||||||
|
"[[\"Norem\"]]"
|
||||||
|
> JSON.ARRINSERT riders $ 1 '"Prickett"' '"Royce"' '"Castilla"'
|
||||||
|
1) (integer) 4
|
||||||
|
> JSON.GET riders $
|
||||||
|
"[[\"Norem\",\"Prickett\",\"Royce\",\"Castilla\"]]"
|
||||||
|
> JSON.ARRTRIM riders $ 1 1
|
||||||
|
1) (integer) 1
|
||||||
|
> JSON.GET riders $
|
||||||
|
"[[\"Prickett\"]]"
|
||||||
|
> JSON.ARRPOP riders $
|
||||||
|
1) "\"Prickett\""
|
||||||
|
> JSON.ARRPOP riders $
|
||||||
|
1) (nil)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### json object操作
|
||||||
|
json oject操作同样有其自己的命令,示例如下:
|
||||||
|
```redis-cli
|
||||||
|
> JSON.SET bike:1 $ '{"model": "Deimos", "brand": "Ergonom", "price": 4972}'
|
||||||
|
OK
|
||||||
|
> JSON.OBJLEN bike:1 $
|
||||||
|
1) (integer) 3
|
||||||
|
> JSON.OBJKEYS bike:1 $
|
||||||
|
1) 1) "model"
|
||||||
|
2) "brand"
|
||||||
|
3) "price"> JSON.SET bike:1 $ '{"model": "Deimos", "brand": "Ergonom", "price": 4972}'
|
||||||
|
```
|
||||||
|
#### format output
|
||||||
|
redis-cli支持对json内容的输出进行格式化,步骤如下:
|
||||||
|
- 在执行`redis-cli`时指定`--raw`选项
|
||||||
|
- 通过formatting keywords来进行格式化
|
||||||
|
- `INDENT`
|
||||||
|
- `NEWLINE`
|
||||||
|
- `SPACE`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ redis-cli --raw
|
||||||
|
> JSON.GET obj INDENT "\t" NEWLINE "\n" SPACE " " $
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "Leonard Cohen",
|
||||||
|
"lastSeen": 1478476800,
|
||||||
|
"loggedOut": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Limitation
|
||||||
|
传递给command的json值最大深度只能为128,如果嵌套深度大于128,那么command将返回错误。
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user