forked from Conflux-Chain/confura
-
Notifications
You must be signed in to change notification settings - Fork 14
/
repartition_redis.go
59 lines (49 loc) · 1.52 KB
/
repartition_redis.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
package node
import (
"context"
"fmt"
"strings"
"time"
"github.com/go-redis/redis/v8"
"github.com/sirupsen/logrus"
)
// RedisRepartitionResolver implements RepartitionResolver
type RedisRepartitionResolver struct {
client *redis.Client
ttl time.Duration
ctx context.Context
keyPrefix string
logger *logrus.Entry
}
func NewRedisRepartitionResolver(client *redis.Client, ttl time.Duration, keyPrefix string) *RedisRepartitionResolver {
return &RedisRepartitionResolver{
client: client,
ttl: ttl,
ctx: context.Background(),
keyPrefix: keyPrefix,
logger: logrus.WithField("module", "RedisRepartitionResolver"),
}
}
func (r *RedisRepartitionResolver) Get(key uint64) (string, bool) {
redisKey := redisRepartitionKey(key, r.keyPrefix)
node, err := r.client.GetEx(r.ctx, redisKey, r.ttl).Result()
if err == redis.Nil {
return "", false
}
if err != nil {
r.logger.WithError(err).WithField("key", redisKey).Error("Failed to read key from redis")
return "", false
}
return node, true
}
func (r *RedisRepartitionResolver) Put(key uint64, value string) {
redisKey := redisRepartitionKey(key, r.keyPrefix)
if err := r.client.Set(r.ctx, redisKey, value, r.ttl).Err(); err != nil {
r.logger.WithError(err).WithField("key", redisKey).Error("Failed to set key-value to redis")
}
}
func redisRepartitionKey(key uint64, prefixs ...string) string {
prefixs = append(prefixs, "key")
prefixStr := strings.Join(prefixs, ":")
return fmt.Sprintf("node:repartition:%v:%v", prefixStr, key)
}