1111 "To use `AioMemCacheBackend`, you have to install 'aiomcache' package e.g. `pip install aiomcache`"
1212 ) from e
1313
14-
1514from ..interface import IBaseCacheBackendAsync
1615from ..make_key_decorator import make_key_decorator , make_key_decorator_and_validate
1716from ..model import BaseCacheBackend
17+ from .serializer import AioCacheSerializer , ICacheSerializer
1818
1919
2020class _AioMemCacheBackendSync (IBaseCacheBackendAsync , ABC ):
@@ -48,6 +48,14 @@ def touch(
4848 )
4949 return bool (res )
5050
51+ def incr (self , key : str , delta : int = 1 , version : str = None ) -> int :
52+ res = self ._async_executor (self .incr_async (key , delta = delta , version = version ))
53+ return t .cast (int , res )
54+
55+ def decr (self , key : str , delta : int = 1 , version : str = None ) -> int :
56+ res = self ._async_executor (self .decr_async (key , delta = delta , version = version ))
57+ return t .cast (int , res )
58+
5159
5260class AioMemCacheBackend (_AioMemCacheBackendSync , BaseCacheBackend ):
5361 """Memcached-based cache backend."""
@@ -61,17 +69,15 @@ def __init__(
6169 port : int = 11211 ,
6270 pool_size : int = 2 ,
6371 pool_minsize : int = None ,
64- serializer : t .Callable = pickle .dumps ,
65- deserializer : t .Callable = pickle .loads ,
72+ serializer : ICacheSerializer = None ,
6673 ** kwargs : t .Any
6774 ) -> None :
6875 super ().__init__ (** kwargs )
6976 self ._client : Client = None # type: ignore[assignment]
7077 self ._client_options = dict (
7178 host = host , port = port , pool_size = pool_size , pool_minsize = pool_minsize
7279 )
73- self ._serializer = serializer
74- self ._deserializer = deserializer
80+ self ._serializer = serializer or AioCacheSerializer ()
7581
7682 def get_backend_timeout (self , timeout : t .Union [float , int ] = None ) -> int :
7783 return int (super ().get_backend_timeout (timeout ))
@@ -86,7 +92,7 @@ def _cache_client(self) -> Client:
8692 async def get_async (self , key : str , version : str = None ) -> t .Optional [t .Any ]:
8793 value = await self ._cache_client .get (key .encode ("utf-8" ))
8894 if value :
89- return self ._deserializer (value )
95+ return self ._serializer . load (value )
9096 return None # pragma: no cover
9197
9298 @make_key_decorator_and_validate
@@ -99,7 +105,7 @@ async def set_async(
99105 ) -> bool :
100106 return await self ._cache_client .set (
101107 key .encode ("utf-8" ),
102- self ._serializer (value , self . pickle_protocol ),
108+ self ._serializer . dumps (value ),
103109 exptime = self .get_backend_timeout (timeout ),
104110 )
105111
@@ -114,3 +120,13 @@ async def touch_async(
114120 return await self ._cache_client .touch (
115121 key .encode ("utf-8" ), exptime = self .get_backend_timeout (timeout )
116122 )
123+
124+ @make_key_decorator
125+ async def incr_async (self , key : str , delta : int = 1 , version : str = None ) -> int :
126+ res = await self ._cache_client .incr (key .encode ("utf-8" ), increment = delta )
127+ return t .cast (int , res )
128+
129+ @make_key_decorator
130+ async def decr_async (self , key : str , delta : int = 1 , version : str = None ) -> int :
131+ res = await self ._cache_client .decr (key .encode ("utf-8" ), decrement = delta )
132+ return t .cast (int , res )
0 commit comments