列表或字典队列的python Redis排序语法

2024-04-16 09:59:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图为一个我正在帮助一个好朋友的网站排序Redis队列,但是我不清楚python中排序的语法。当我得到Redis的时候,它已经在后台大量使用了Redis,所以我一直在尝试如何使用Redis和现有的架构。我有以下要根据特定字段排序的队列:

personal_queue = RedisQueue(name=personal_queuename, host='localhost', port=6379, db=0)

其中personal_queuename是一个字符串

队列在当前网站实现中的每个条目(稍微简化)中都包含以下信息:

^{pr2}$

所以它有点像一个字典队列,除了实际上没有任何键,除非您将队列中的索引看作一个映射到基本字符串列表的键。在队列的最前面,这个队列的值应该是最小的。我的问题是,如果这是可能的,如何做到,和/或如何重新组织队列,以按此排序,如果它不可能与当前的实现。我还将对其他稍有不同的队列进行排序,因此知道如何以这种方式进行排序将使我能够用相同的基本结构对其他内容进行排序。在

我见过有人提到如何使用通用的Redis语法进行排序,但我找不到任何东西来指定如何排序1)特别是使用python代码,或者2)在我想处理的特定字段上进行排序,因为它们有点难以理解(我不想用这种方式组织它,但这是有意义的,也许Redis只需要数据这样组织吗。我想我可能需要以某种方式修改数据,但是由于我不熟悉Redis,需要稍微更改站点的后端,所以我不确定应该将什么值传递给sort函数,即使问题比较简单。在

我发现语法基本上是:

sort(personal_queuename, by=None, get=None)

但我不知道该用什么来代替它们。我对这一点很陌生,所以如果你能解释一下每个领域的信息类型,以及在我的案例中对应的信息类型,那将对我有很大帮助。我可以稍微改变一下数据,但我需要能够将合作伙伴的ID映射到相对的\u评级(例如,我现在这样做的方式),并且最好将合作伙伴的ID映射到多个字段,如下所示:

':'.join((str(partner_id), other_field1, other_field2, str(relative_rating)))

我需要使用Redis队列来实现这一点,因为另一个后端实现(它以前没有对队列进行排序,但仍然广泛地使用它们的数据)。在

RedisQueue是此类:

import redis

class RedisQueue(object):

    def __init__(self, name, **redis_kwargs):
        '''Initializes connection to specified redis queue.
           The default connection parameters are: host='localhost', port=6379, db=0'''
        self.__db = redis.Redis(**redis_kwargs)
        self.key = name

    def qsize(self):
        """Return the size of the queue."""
        return self.__db.llen(self.key)

    def empty(self):
        """Return True if the queue is empty, False otherwise."""
        return self.qsize() == 0

    def push(self, item):
        """Place an item into the queue."""
        self.__db.rpush(self.key, item)

    def pop(self, block=False, timeout=None):
        """Remove and return an item from the queue.
        If optional argument block is true and timeout is None (the default), block
        if necessary until an item becomes available."""
        if block:
            item = self.__db.blpop(self.key, timeout=timeout)
            if item:
                item = item[1]
        else:
            item = self.__db.lpop(self.key)
        return item

    def rem(self, item):
        self.__db.lrem(self.key, item, 1)

    def all(self):
        return self.__db.lrange(self.key, 0, -1)

    def get_nowait(self):
        """Equivalent to get(False)."""
        return self.get(False)

我已经看了这些链接,但是不知道如何访问我想要排序的数据字段(使用python语法,这对我很关键——我知道有些答案引用了通用的Redis语法):

https://redis-py.readthedocs.org/en/latest/index.html

Indexing using Redis sorted sets

How to remove items in a sorted set using python in redis

Dynamic sort with Redis

谢谢你!在


Tags: thekeyselfredisdbreturn排序队列