-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlua.go
92 lines (84 loc) · 2.01 KB
/
lua.go
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
package delay_queue
import (
"context"
"crypto/sha1"
"encoding/hex"
)
const (
GetMessageAckScript = `
local messages = redis.call('ZRANGEBYSCORE', KEYS[1], '-inf', ARGV[1], 'LIMIT', 0, KEYS[3]);
if #messages > 0 then
redis.call('ZREM', KEYS[1], unpack(messages));
local zaddArr = {}
for index,message in ipairs(messages)
do
table.insert(zaddArr, ARGV[2]);
table.insert(zaddArr, message);
end
redis.call('ZADD', KEYS[2], unpack(zaddArr));
return messages;
else
return {};
end
`
GetMessageScript = `
local messages = redis.call('ZRANGEBYSCORE', KEYS[1], '-inf', ARGV[1], 'LIMIT', 0, KEYS[3]);
if #messages > 0 then
redis.call('ZREM', KEYS[1], unpack(messages));
return messages;
else
return {};
end
`
AckMonitorScript = `
local messages = redis.call('ZRANGEBYSCORE', KEYS[1], '-inf', ARGV[1], 'LIMIT', 0, KEYS[3]);
if #messages > 0 then
redis.call('ZREM', KEYS[1], unpack(messages));
local zaddArr = {}
for index,message in ipairs(messages)
do
table.insert(zaddArr, 1);
table.insert(zaddArr, message);
end
redis.call('ZADD', KEYS[2], unpack(zaddArr));
end
return {};
`
DelMessageScript = `
redis.call('ZREM', KEYS[1], ARGV[1]);
redis.call('ZREM', KEYS[2], ARGV[1]);
return true;
`
NoScript = "NOSCRIPT No matching script. Please use EVAL."
)
var GetMessageLuaScript = map[string]string{
AckTypeAuto: GetMessageAckScript,
AckTypeManual: GetMessageAckScript,
AckTypeDisable: GetMessageScript,
}
func execLuaScript(
ctx context.Context,
redis Redis,
sha1 string,
script string,
values []interface{},
) (interface{}, error) {
res, err := redis.EvalSha(ctx, sha1, values)
if err == nil || err.Error() != NoScript {
return res, nil
}
err = redis.LoadScript(ctx, script)
if err != nil {
return nil, err
}
res, err = redis.EvalSha(ctx, sha1, values)
if err != nil {
return nil, err
}
return res, nil
}
func sha1Script(script string) string {
o := sha1.New()
o.Write([]byte(script))
return hex.EncodeToString(o.Sum(nil))
}