...
1 package ldredis
2
3 import (
4 "fmt"
5 "strconv"
6
7 r "github.com/gomodule/redigo/redis"
8
9 "github.com/launchdarkly/go-sdk-common/v3/ldlog"
10 "github.com/launchdarkly/go-sdk-common/v3/ldtime"
11 "github.com/launchdarkly/go-server-sdk/v6/subsystems"
12 "github.com/launchdarkly/go-server-sdk/v6/subsystems/ldstoreimpl"
13 )
14
15
16 type redisBigSegmentStoreImpl struct {
17 prefix string
18 pool Pool
19 loggers ldlog.Loggers
20 }
21
22 func newRedisBigSegmentStoreImpl(
23 builder builderOptions,
24 loggers ldlog.Loggers,
25 ) *redisBigSegmentStoreImpl {
26 impl := &redisBigSegmentStoreImpl{
27 prefix: builder.prefix,
28 pool: builder.pool,
29 loggers: loggers,
30 }
31 impl.loggers.SetPrefix("RedisBigSegmentStore:")
32
33 if impl.pool == nil {
34 logRedisURL(loggers, builder.url)
35 impl.pool = newPool(builder.url, builder.dialOptions)
36 }
37 return impl
38 }
39
40 func (store *redisBigSegmentStoreImpl) GetMetadata() (subsystems.BigSegmentStoreMetadata, error) {
41 c := store.getConn()
42 defer c.Close()
43
44 valueStr, err := r.String(c.Do("GET", bigSegmentsSyncTimeKey(store.prefix)))
45 if err != nil {
46 if err == r.ErrNil {
47
48 err = nil
49 }
50 return subsystems.BigSegmentStoreMetadata{}, err
51 }
52 value, err := strconv.ParseUint(valueStr, 10, 64)
53 if err != nil {
54 return subsystems.BigSegmentStoreMetadata{}, err
55 }
56
57 return subsystems.BigSegmentStoreMetadata{
58 LastUpToDate: ldtime.UnixMillisecondTime(value),
59 }, nil
60 }
61
62 func (store *redisBigSegmentStoreImpl) GetMembership(
63 contextHashKey string,
64 ) (subsystems.BigSegmentMembership, error) {
65 c := store.getConn()
66 defer c.Close()
67
68 includedRefs, err := r.Strings(c.Do("SMEMBERS", bigSegmentsIncludeKey(store.prefix, contextHashKey)))
69 if err != nil && err != r.ErrNil {
70 return nil, err
71 }
72 excludedRefs, err := r.Strings(c.Do("SMEMBERS", bigSegmentsExcludeKey(store.prefix, contextHashKey)))
73 if err != nil && err != r.ErrNil {
74 return nil, err
75 }
76
77 return ldstoreimpl.NewBigSegmentMembershipFromSegmentRefs(includedRefs, excludedRefs), nil
78 }
79
80 func (store *redisBigSegmentStoreImpl) Close() error {
81 return store.pool.Close()
82 }
83
84 func (store *redisBigSegmentStoreImpl) getConn() r.Conn {
85 return store.pool.Get()
86 }
87
88 func bigSegmentsSyncTimeKey(prefix string) string {
89 return fmt.Sprintf("%s:big_segments_synchronized_on", prefix)
90 }
91
92 func bigSegmentsIncludeKey(prefix, contextHashKey string) string {
93 return fmt.Sprintf("%s:big_segment_include:%s", prefix, contextHashKey)
94 }
95
96 func bigSegmentsExcludeKey(prefix, contextHashKey string) string {
97 return fmt.Sprintf("%s:big_segment_exclude:%s", prefix, contextHashKey)
98 }
99
View as plain text