python操作redis使zset数据类型支持高并发

221 阅读1分钟

python操作redis使zset数据类型支持高并发

import redis


class PriorityQueue(object):
    '''
    用redis做队列的类
    '''

    def __init__(self, name):
        '''
        :param name: 集合名
        '''
        self.server = redis.Redis(host='localhost',port=6379,db=5)
        self.name = name

    def qsize(self):
        '''
        :return:队列长度
        '''
        return self.server.zcard(self.name)

    def push(self, url, score):
        '''
        :param url: 需要下载页面的详情页url
        :param score: 整型时间戳
        :return: None
        '''
        self.server.execute_command('ZADD', self.name, score, url)

    def deleteKey(self, key):
        self.server.execute_command('DEL', self.name, key)

    def pop(self, timeout=0):
        '''
        :param timeout: 超时时间
        :return: 需要下载页面的详情页url
        '''
        # 加管道,降低延迟
        pipe = self.server.pipeline()
        pipe.multi()
        pipe.zrange(self.name, 0, 0).zremrangebyrank(self.name , 0, 0)
        results, count = pipe.execute()
        if results:
            return results[0].decode('utf-8')