8
8
REDIS_PASSWORD = getattr (settings , 'EXPERIMENTS_REDIS_PASSWORD' , None )
9
9
REDIS_EXPERIMENTS_DB = getattr (settings , 'EXPERIMENTS_REDIS_DB' , 0 )
10
10
11
- r = redis .Redis (host = REDIS_HOST , port = REDIS_PORT , password = REDIS_PASSWORD , db = REDIS_EXPERIMENTS_DB )
12
-
13
11
COUNTER_CACHE_KEY = 'experiments:participants:%s'
14
12
COUNTER_FREQ_CACHE_KEY = 'experiments:freq:%s'
15
13
16
14
17
15
class Counters (object ):
16
+ def __init__ (self ):
17
+ self .redis = redis .Redis (host = REDIS_HOST , port = REDIS_PORT , password = REDIS_PASSWORD , db = REDIS_EXPERIMENTS_DB )
18
+
18
19
def increment (self , key , participant_identifier , count = 1 ):
19
20
if count == 0 :
20
21
return
21
22
22
23
try :
23
24
cache_key = COUNTER_CACHE_KEY % key
24
25
freq_cache_key = COUNTER_FREQ_CACHE_KEY % key
25
- new_value = r .hincrby (cache_key , participant_identifier , count )
26
+ new_value = self . redis .hincrby (cache_key , participant_identifier , count )
26
27
27
28
# Maintain histogram of per-user counts
28
29
if new_value > count :
29
- r .hincrby (freq_cache_key , new_value - count , - 1 )
30
- r .hincrby (freq_cache_key , new_value , 1 )
30
+ self . redis .hincrby (freq_cache_key , new_value - count , - 1 )
31
+ self . redis .hincrby (freq_cache_key , new_value , 1 )
31
32
except (ConnectionError , ResponseError ):
32
33
# Handle Redis failures gracefully
33
34
pass
@@ -36,28 +37,28 @@ def clear(self, key, participant_identifier):
36
37
try :
37
38
# Remove the direct entry
38
39
cache_key = COUNTER_CACHE_KEY % key
39
- pipe = r .pipeline ()
40
+ pipe = self . redis .pipeline ()
40
41
freq , _ = pipe .hget (cache_key , participant_identifier ).hdel (cache_key , participant_identifier ).execute ()
41
42
42
43
# Remove from the histogram
43
44
freq_cache_key = COUNTER_FREQ_CACHE_KEY % key
44
- r .hincrby (freq_cache_key , freq , - 1 )
45
+ self . redis .hincrby (freq_cache_key , freq , - 1 )
45
46
except (ConnectionError , ResponseError ):
46
47
# Handle Redis failures gracefully
47
48
pass
48
49
49
50
def get (self , key ):
50
51
try :
51
52
cache_key = COUNTER_CACHE_KEY % key
52
- return r .hlen (cache_key )
53
+ return self . redis .hlen (cache_key )
53
54
except (ConnectionError , ResponseError ):
54
55
# Handle Redis failures gracefully
55
56
return 0
56
57
57
58
def get_frequency (self , key , participant_identifier ):
58
59
try :
59
60
cache_key = COUNTER_CACHE_KEY % key
60
- freq = r .hget (cache_key , participant_identifier )
61
+ freq = self . redis .hget (cache_key , participant_identifier )
61
62
return int (freq ) if freq else 0
62
63
except (ConnectionError , ResponseError ):
63
64
# Handle Redis failures gracefully
@@ -70,17 +71,17 @@ def get_frequencies(self, key):
70
71
# briefly be a negative result for some frequency count. We discard these
71
72
# as they shouldn't really affect the result, and they are about to become
72
73
# zero anyway.
73
- return dict ((int (k ), int (v )) for (k , v ) in r .hgetall (freq_cache_key ).items () if int (v ) > 0 )
74
+ return dict ((int (k ), int (v )) for (k , v ) in self . redis .hgetall (freq_cache_key ).items () if int (v ) > 0 )
74
75
except (ConnectionError , ResponseError ):
75
76
# Handle Redis failures gracefully
76
77
return tuple ()
77
78
78
79
def reset (self , key ):
79
80
try :
80
81
cache_key = COUNTER_CACHE_KEY % key
81
- r .delete (cache_key )
82
+ self . redis .delete (cache_key )
82
83
freq_cache_key = COUNTER_FREQ_CACHE_KEY % key
83
- r .delete (freq_cache_key )
84
+ self . redis .delete (freq_cache_key )
84
85
return True
85
86
except (ConnectionError , ResponseError ):
86
87
# Handle Redis failures gracefully
@@ -90,11 +91,11 @@ def reset_pattern(self, pattern_key):
90
91
#similar to above, but can pass pattern as arg instead
91
92
try :
92
93
cache_key = COUNTER_CACHE_KEY % pattern_key
93
- for key in r .keys (cache_key ):
94
- r .delete (key )
94
+ for key in self . redis .keys (cache_key ):
95
+ self . redis .delete (key )
95
96
freq_cache_key = COUNTER_FREQ_CACHE_KEY % pattern_key
96
- for key in r .keys (freq_cache_key ):
97
- r .delete (key )
97
+ for key in self . redis .keys (freq_cache_key ):
98
+ self . redis .delete (key )
98
99
return True
99
100
except (ConnectionError , ResponseError ):
100
101
# Handle Redis failures gracefully
0 commit comments