-
Notifications
You must be signed in to change notification settings - Fork 1
/
json.lua
218 lines (196 loc) · 7.12 KB
/
json.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
local Cache = require "Cache"
local class = require "class"
local type = type
local assert = assert
local RedisJSON = class("RedisJSON")
function RedisJSON:ctor(opt)
self.redis = Cache:new(opt)
end
---comment @连接到服务
function RedisJSON:connect()
return self.redis:connect()
end
---comment 创建文档
---@param name string @文档名
---@param json string @文档内容
---@return boolean @成功返回`true`, 失败返回原因.
function RedisJSON:create(name, json)
assert(type(name) == 'string', "Invalid document name.")
return self.redis['JSON.SET'](self.redis, name, '.', json or "{}")
end
---comment 删除文档
---@param name string @文档名
---@return boolean @成功返回`true`, 失败返回`false`与失败原因.
function RedisJSON:remove(name)
assert(type(name) == 'string', "Invalid document name.")
local ok, num = self.redis['del'](self.redis, name)
return (ok and num == 1) and true or false
end
---comment 清空指定文档对象/数组
---@param name string @文档名
---@param path string @路径/字段名
function RedisJSON:clear(name, path)
assert(type(name) == 'string', "Invalid document name.")
assert(type(path) == 'string', "Invalid document path.")
return self.redis['JSON.CLEAR'](self.redis, name, path)
end
---comment 检查字段类型
---@param name string @文档名
---@param path string @路径/字段名
---@return boolean @成功返回`string`类型, 失败返回`false`与失败原因.
function RedisJSON:type(name, path)
assert(type(name) == 'string', "Invalid document name.")
local ok, info = self.redis['JSON.TYPE'](self.redis, name, path)
if not ok then
return false, info
end
return info or 'nil'
end
---comment 获取`string`字段的长度
---@param name string @文档名
---@param path string @路径/字段名
---@return boolean @成功返回`string`类型长度, 失败返回`false`与失败原因.
function RedisJSON:strlen(name, path)
assert(type(name) == 'string', "Invalid document name.")
local ok, info = self.redis['JSON.STRLEN'](self.redis, name, path)
if not ok then
return false, info
end
if not info then
return false, "Cant't find `" .. name .. '` and `' .. path .. '`'
end
return info
end
---comment 获取`string`字段的长度
---@param name string @文档名
---@param path string @路径/字段名
---@param value string @待追加内容
function RedisJSON:strappend(name, path, value)
assert(type(name) == 'string', "Invalid document name.")
assert(type(path) == 'string', "Invalid document path.")
assert(type(value) == 'string', "Invalid document value.")
return self.redis['JSON.STRAPPEND'](self.redis, name, path, value)
end
---comment 写入字段
---@param name string @文档名
---@param path string @路径/字段名
---@param value string @待写入内容
---@return boolean @成功返回`true`, 失败返回原因.
function RedisJSON:set(name, path, value)
assert(type(name) == 'string', "Invalid document name.")
assert(type(path) == 'string', "Invalid document path.")
return self.redis['JSON.SET'](self.redis, name, path, type(value) == 'number' and value or ('"' .. value .. '"'))
end
---comment 获取指定字段内容
---@param name string @文档名
---@param path string @路径/字段名
---@return boolean | string @失败返回`nil`, 成功返回`string`.
function RedisJSON:get(name, path, ...)
assert(type(name) == 'string', "Invalid document name.")
assert(type(path) == 'string', "Invalid document path.")
local ok, info = self.redis['JSON.GET'](self.redis, name, path, ...)
if not ok then
return false, info
end
return info
end
---comment 获取多个文档指定字段内容
---@param name1 string @文档名1
---@param name2 string @文档名2
---@param ... string @`1`或`N`个文档名, 最后一个参数始终是路径或字段名.
---@return boolean | table @失败返回`nil`, 成功返回`table`(数组).
function RedisJSON:mget(name1, name2, ...)
assert(type(name1) == 'string', "Invalid document name.")
local ok, info = self.redis['JSON.MGET'](self.redis, name1, name2, ...)
if not ok then
return false, info
end
return info
end
---comment 为`1`或`N`个字段做递增操作.
---@param name string @文档名
---@param path string @路径/字段名
---@param num string @待写入内容
function RedisJSON:numincrby(name, path, num)
assert(type(name) == 'string', "Invalid document name.")
assert(type(path) == 'string', "Invalid document path.")
local ok, info = self.redis['JSON.NUMINCRBY'](self.redis, name, path, num)
if not ok then
return false, info
end
return info
end
---comment 获取`path`下的所有字段名
---@param name string @文档名
---@param path string @路径/字段名
function RedisJSON:objkeys(name, path)
assert(type(name) == 'string', "Invalid document name.")
local ok, info = self.redis['JSON.OBJKEYS'](self.redis, name, path or '.')
if not ok then
return false, info
end
return info
end
---comment 计算`path`下的字段数量
---@param name string @文档名
---@param path string @路径/字段名
function RedisJSON:objlen(name, path)
assert(type(name) == 'string', "Invalid document name.")
local ok, info = self.redis['JSON.OBJLEN'](self.redis, name, path)
if not ok then
return false, info
end
return info
end
---comment 计算`path`下的数组长度
---@param name string @文档名
---@param path string @路径/字段名
function RedisJSON:arrlen(name, path)
assert(type(name) == 'string', "Invalid document name.")
assert(type(path) == 'string', "Invalid document path.")
local ok, info = self.redis['JSON.ARRLEN'](self.redis, name, path)
if not ok then
return false, info
end
return info
end
---comment 弹出数组字段下的最后一个值
---@param name string @文档名
---@param path string @路径/字段名
function RedisJSON:arrpop(name, path, ...)
assert(type(name) == 'string', "Invalid document name.")
assert(type(path) == 'string', "Invalid document path.")
local ok, info = self.redis['JSON.ARRPOP'](self.redis, name, path, ...)
if not ok then
return false, info
end
return info
end
---comment 删除数组指定下标之外的所有元素
---@param name string @文档名
---@param path string @路径/字段名
---@param start integer @起始下标(默认为`1`)
---@param stop integer @结束下标(默认为`1`)
function RedisJSON:arrtrim(name, path, start, stop)
assert(type(name) == 'string', "Invalid document name.")
assert(type(path) == 'string', "Invalid document path.")
local ok, info = self.redis['JSON.ARRTRIM'](self.redis, name, path, start or 0, stop or -1)
if not ok then
return false, info
end
return info
end
---comment 删除数组指定下标之外的所有元素
---@param name string @文档名
---@param path string @路径/字段名
---@param index integer @数组索引下标
function RedisJSON:arrinsert(name, path, index, ...)
assert(type(name) == 'string', "Invalid document name.")
assert(type(path) == 'string', "Invalid document path.")
local ok, info = self.redis['JSON.ARRTRIM'](self.redis, name, path, ...)
if not ok then
return false, info
end
return info
end
return RedisJSON