예제 #1
0
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
예제 #2
0
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
예제 #3
0
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)
예제 #4
0
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])