/
scanfetch.lua
48 lines (42 loc) · 887 Bytes
/
scanfetch.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
--[[
Scans the keyspace for pattern, and returns the values.
SCAN-like usage, i.e. call repeatedly until cursor zeros:
redis-cli --eval scanfetch.lua , <cursor> <pattern>
Known issues:
* String-based types (HLL, bitmaps and bitfields) are not handled
]]--
local cursor = tonumber(ARGV[1])
local pattern = ARGV[2]
local getters = {
['string'] = {
{'GET'},
{}
},
['list'] = {
{'LRANGE'},
{0, -1}
},
['set'] = {
{'SMEMBERS'},
{}
},
['zset'] = {
{'ZRANGE'},
{0, -1, 'WITHSCORES'}
},
['hash'] = {
{'HGETALL'},
{}
},
['stream'] = {
{'XRANGE'},
{'-', '+'}
}
}
local scan = redis.call('SCAN', cursor, 'MATCH', pattern)
for i, key in ipairs(scan[2]) do
local t = redis.call('TYPE', key)['ok']
local val = redis.call(unpack(getters[t][1]), key, unpack(getters[t][2]))
scan[2][i] = { t, key, val }
end
return scan