async def get_ride_id(redis_cli: Redis, user_id: str) -> Optional[str]: async for key in redis_cli.iscan(match=_get_ride_key("*", user_id)): return str(key.decode().split(":")[1]) async for _ in redis_cli.iscan(match=_get_ride_key(user_id, "*")): # noqa return user_id return None
async def kline_interval(market: str, interval: int, count: int, redis_client: Redis = Depends(get_redis_database)): # f"^kline-{market}.*-{interval}.*-latest$" pattern = f"kline-{market}-{interval}-*" kline_keys = [] async for key in redis_client.iscan(match=pattern): kline_keys.append(key) kline_keys.sort(reverse=True) # results = [] # for key in kline_keys: # value = await CrudRedisGeneral.get(redis_client, key) # results.append({key:value}) results = collections.OrderedDict() for i in range(len(kline_keys)): if i >= count: break key = kline_keys[i] value = await CrudRedisGeneral.get(redis_client, key) results[key] = value return results
async def get(redis_cli: Redis, ride_id: str) -> Optional[Ride]: keys = [key async for key in redis_cli.iscan(match=_get_ride_key(ride_id, "*"))] if not keys: return None passengers_key = [key.decode().rpartition(":")[-1] for key in keys] driver = await profile_repo.get(redis_cli, ride_id) if driver is None: return None passengers = [] for key in passengers_key: profile = await profile_repo.get(redis_cli, key) if profile is None: continue passengers.append( Passenger(profile=profile, status=(await redis_cli.get(_get_ride_key(ride_id, key))).decode()) ) if not passengers: return None return Ride(ride_id=ride_id, driver=driver, passengers=passengers)
async def persist(redis_cli: Redis, user_id: str) -> None: ride_id = await get_ride_id(redis_cli, user_id) if ride_id is not None: keys = [key async for key in redis_cli.iscan(match=_get_ride_key(ride_id, "*"))] await asyncio.gather(*[redis_cli.persist(key) for key in keys])