python3.7 redis隊列類實現

# -*- coding: utf-8 -*-
import logging
from typing import List
logger = logging.getLogger(__name__)

class BaseQueue(object):
    def __init__(self,redis_cli, name):
        self.redis_cli = redis_cli
        self.name = name

    async def items(self):
        return await self.redis_cli.lrange(self.name, 0, -1)

    async def push(self, *value, force: bool = True):
        if force:
            await self.redis_cli.lpush(self.name, *value)
        else:
            values = await self.items()
            new_value = [i for i in value if bytes(i, encoding="utf8") not in values]
            if new_value:
                await self.redis_cli.lpush(self.name, *new_value)

    async def pop(self):
        return await self.redis_cli.rpop(self.name)

    async def remove(self, value):
        await self.redis_cli.lrem(self.name, 0, value)

    async def has(self, value) -> bool:
        s = await self.items()
        return True if s and value in s else False

class MaintainQueue(BaseQueue):
    def __init__(self, redis_cli):
        super(MaintainQueue, self).__init__(redis_cli, 'proxy:job:maintain')

    async def add_job(self, data):
        await self.push(data)

class MaintainQueueManager(object):
    def __init__(self, redis_cli):
        self.host_queue = BaseQueue(redis_cli, 'maintain:host')
        self.job_queue = MaintainQueue(redis_cli)

class JobQueue(BaseQueue):
    def __init__(self, redis_cli, name):
        self.redis_cli = redis_cli
        self.__key__ = name
        self.queue_prefix = "proxy:job:general:"
        super(JobQueue, self).__init__(redis_cli, f"{self.queue_prefix}{name}")



class JobQueueManager(object):
    def __init__(self, redis_cli):
        self.redis_cli = redis_cli
        self.queue_prefix = "proxy:job:general:"

    async def queues(self) -> List[JobQueue]:
        return [JobQueue(self.redis_cli, i.decode().split(self.queue_prefix)[1]) \
                async for i in self.redis_cli.scan_iter(match=f"{self.queue_prefix}*")]

    async def add_job(self, key, value):
        await JobQueue(self.redis_cli, key).push(value)




發佈了133 篇原創文章 · 獲贊 125 · 訪問量 39萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章