doc: 阅读RedisJSON文档

This commit is contained in:
asahi
2025-09-05 11:14:22 +08:00
parent 42dbfbac36
commit 39f792e911

View File

@@ -22,6 +22,24 @@
- [WATCH](#watch)
- [UNWATCH](#unwatch)
- [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
@@ -357,6 +375,8 @@ EXEC
`EXEC`命令被调用后所有的watched keys都会被`unwatched`不管事务是否被aborted。并且当client连接关闭后所有keys都会被unwatched。
对于`discard`命令其在调用后所有watched keys也会自动被`unwatched`
#### UNWATCH
可以通过`UNWATCH`命令无参数来清空所有的watched keys。
@@ -375,3 +395,197 @@ MULTI
ZREM zset element
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将返回错误。