1
|
|
|
import redis |
2
|
|
|
|
3
|
|
|
class Cache: |
4
|
|
|
''' in memory cache''' |
5
|
|
|
__redis = None |
6
|
|
|
isonline = False |
7
|
|
|
def __init__(self, servicelogin): |
8
|
|
|
self.encoding = 'utf-8' |
9
|
|
|
self.__redis = redis.Redis(host=servicelogin.host, port=servicelogin.port, password=servicelogin.password) |
10
|
|
|
self.isonline = True |
11
|
|
|
def iskeyexists(self, key): |
12
|
|
|
'''true when key exists in cache''' |
13
|
|
|
return self.__redis.exists(key) |
14
|
|
|
def get(self, key): |
15
|
|
|
'''get value from key''' |
16
|
|
|
try: |
17
|
|
|
return self.__redis.get(key) |
18
|
|
|
except redis.exceptions.ConnectionError as ex: |
19
|
|
|
self.isonline = False |
20
|
|
|
raise ex |
21
|
|
|
def getlist(self, key): |
22
|
|
|
'''get a list from key''' |
23
|
|
|
return self.__redis.lrange(key, 0, -1) |
24
|
|
|
|
25
|
|
|
def put(self, key, value): |
26
|
|
|
'''store a value into key''' |
27
|
|
|
self.__redis.set(key, value) |
28
|
|
|
|
29
|
|
|
def putinhashset(self, name, key, value): |
30
|
|
|
'''store value into key at name''' |
31
|
|
|
if not isinstance(value, str): |
32
|
|
|
raise ValueError('hashset value must be a string') |
33
|
|
|
self.__redis.hset(name, key, value) |
34
|
|
|
|
35
|
|
|
def getfromhashset(self, name, key): |
36
|
|
|
'''get value in hashset''' |
37
|
|
|
return self.__redis.hget(name, key) |
38
|
|
|
|
39
|
|
|
def gethashset(self, name): |
40
|
|
|
'''this will return keys and values from hashset''' |
41
|
|
|
output = {} |
42
|
|
|
hashitems = self.__redis.hgetall(name) |
43
|
|
|
for key, value in hashitems.items(): |
44
|
|
|
output[key.decode(self.encoding)] = value.decode(self.encoding) |
45
|
|
|
return output |
46
|
|
|
|
47
|
|
|
def set(self, key, value): |
48
|
|
|
'''save value to cache key''' |
49
|
|
|
self.__redis.set(key, value) |
50
|
|
|
|
51
|
|
|
def delete(self, key): |
52
|
|
|
'''remove key''' |
53
|
|
|
self.__redis.delete(key) |
54
|
|
|
|
55
|
|
|
def hdel(self, name, key): |
56
|
|
|
'''remove key''' |
57
|
|
|
self.__redis.hdel(name, key) |
58
|
|
|
|
59
|
|
|
def purge(self): |
60
|
|
|
allkeys = self.__redis.scan_iter() |
61
|
|
|
for key in allkeys: |
62
|
|
|
self.delete(key) |
63
|
|
|
print("deleted key: {}".format(key)) |
64
|
|
|
|
65
|
|
|
def close(self): |
66
|
|
|
'''close the cache''' |
67
|
|
|
self.__redis = None |
68
|
|
|
|
69
|
|
|
def tryputcache(self, key, value): |
70
|
|
|
'''put value in cache key''' |
71
|
|
|
if value is None: return |
72
|
|
|
try: |
73
|
|
|
if self.__redis is not None: |
74
|
|
|
self.put(key, value) |
75
|
|
|
except redis.exceptions.ConnectionError as ex: |
76
|
|
|
self.logexception(ex) |
77
|
|
|
|
78
|
|
|
def trygetvaluefromcache(self, key): |
79
|
|
|
'''get value from cache |
80
|
|
|
similar to get but does not raise exception |
81
|
|
|
''' |
82
|
|
|
try: |
83
|
|
|
return self.get(key) |
84
|
|
|
except Exception: |
85
|
|
|
pass |
86
|
|
|
return None |
87
|
|
|
|
88
|
|
|
|
89
|
|
|
class CacheKeys: |
90
|
|
|
'''all keys stored in cache''' |
91
|
|
|
knownminers = 'knownminers' |
92
|
|
|
knownpools = 'knownpools' |
93
|
|
|
knownsensors = 'knownsensors' |
94
|
|
|
#named pools, a big string. obsolete |
95
|
|
|
pools = 'pools' |
96
|
|
|
miners = 'miners' |
97
|
|
|
camera = 'camera' |
98
|
|
|
|