Skip to content

Commit 262eaba

Browse files
authored
Merge pull request #2 from basalam/feat/add-callback-to-redis-cache
feat: added callbacks to redis class, self._trigger method to run cal…
2 parents ae11936 + 0c4a342 commit 262eaba

1 file changed

Lines changed: 27 additions & 0 deletions

File tree

src/basalam/backbone_redis_cache/redis_cache.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99

1010
class RedisCache:
11+
__callbacks: List[Callable[[str, Any], None]] = []
12+
1113
def __init__(
1214
self,
1315
connection: Redis,
@@ -20,55 +22,80 @@ def __init__(
2022
self._deserialize = deserializer
2123
self._serialize = serializer
2224

25+
@classmethod
26+
def add_callback(cls, callback: Callable[[str, Any], None]) -> None:
27+
cls.__callbacks.append(callback)
28+
29+
@classmethod
30+
def clear_callbacks(cls) -> None:
31+
cls.__callbacks.clear()
32+
33+
def _trigger(self, operation: str, details: Any = None) -> None:
34+
for callback in self.__callbacks:
35+
callback(operation, details)
36+
2337
async def get(self, key: str, default=None) -> Any:
38+
self._trigger("GET", key)
2439
result: str = await self._connection.get(self._prefix + key)
2540
return self._deserialize(result) if result is not None else default
2641

2742
async def exists(self, key: str) -> bool:
43+
self._trigger("EXISTS", key)
2844
return await self._connection.exists(self._prefix + key) != 0
2945

3046
async def set(self, key: str, value: Any, seconds: Optional[int] = None) -> None:
47+
self._trigger("SET", key)
3148
await self._connection.set(self._prefix + key, self._serialize(value), ex=seconds)
3249

3350
async def cset(self, key: str, increment: int = 1, seconds: Optional[int] = None) -> None:
51+
self._trigger("CSET", key)
3452
number = await self._connection.incrby(self._prefix + key, increment)
3553
if number == increment:
3654
await self._connection.pexpire(self._prefix + key, seconds * 1000)
3755

3856
async def mset(self, dictionary: Dict[str, Any], seconds: Optional[int] = None) -> None:
57+
self._trigger("MSET", list(dictionary.keys()))
3958
pipe = self._connection.pipeline()
4059
for key, value in dictionary.items():
4160
await pipe.set(self._prefix + key, self._serialize(value), ex=seconds)
4261
await pipe.execute()
4362

4463
async def mget(self, keys: List[str], default=None) -> List[Any]:
64+
self._trigger("MGET", keys)
4565
results = await self._connection.mget([self._prefix + key for key in keys])
4666
return [
4767
self._deserialize(result) if result is not None else default
4868
for result in results
4969
]
5070

5171
async def cget(self, key: str) -> int:
72+
self._trigger("CGET", key)
5273
number = await self._connection.get(self._prefix + key)
5374
return 0 if number is None else int(number)
5475

5576
async def forget(self, key) -> None:
77+
self._trigger("FORGET", key)
5678
await self._connection.delete(self._prefix + key)
5779

5880
async def flush(self):
81+
self._trigger("FLUSH", None)
5982
await self._connection.flushdb()
6083
await self._connection.flushall()
6184

6285
async def hset(self, name, key, value):
86+
self._trigger("HSET", {"name": name, "field": key})
6387
await self._connection.hset(name=self._prefix + name, key=key, value=value)
6488

6589
async def hget(self, name, key):
90+
self._trigger("HGET", {"name": name, "field": key})
6691
return await self._connection.hget(name=self._prefix + name, key=key)
6792

6893
async def expire(self, name, _time):
94+
self._trigger("EXPIRE", name)
6995
await self._connection.expire(name=self._prefix + name, time=_time)
7096

7197
async def scan(self, match: Optional[str] = "*") -> List:
98+
self._trigger("SCAN", match)
7299
return_ = []
73100
cursor = '0'
74101
while cursor:

0 commit comments

Comments
 (0)