diff --git a/asyncio_redis_rate_limit/__init__.py b/asyncio_redis_rate_limit/__init__.py index 2d73fea..fdda6dc 100644 --- a/asyncio_redis_rate_limit/__init__.py +++ b/asyncio_redis_rate_limit/__init__.py @@ -84,6 +84,10 @@ async def __aexit__( ) -> None: """Do nothing. We need this to ``__aenter__`` to work.""" + async def redis_version(self): + version = await self._backend.info(section='SERVER') + return version['redis_version'] + # Private API: async def _acquire(self) -> None: @@ -95,7 +99,17 @@ async def _acquire(self) -> None: pipeline = self._backend.pipeline() async with self._lock: - current_rate = await self._run_pipeline(cache_key, pipeline) + redis_version = await self.redis_version() + + if int(redis_version.split('.')[0]) < 7: + current_rate, *_ = await pipeline.incr(cache_key).execute() + if current_rate == 1: + await pipeline.expire( + cache_key, + self._rate_spec.seconds + ).execute() + else: + current_rate = await self._run_pipeline(cache_key, pipeline) # This looks like a coverage error on 3.10: if current_rate > self._rate_spec.requests: # pragma: no cover raise RateLimitError('Rate limit is hit', current_rate)