88
99
1010class 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