Redis使用Python Redis时,流长度限制不起作用

4

现在我正在使用 Python(Python 3) redis 客户端向 redis 流添加元素,这是该库的依赖项:

redis~=5.0.3

接下来是我使用Python将元素写入Redis的代码:

def push_message_to_stream(article):
    try:
        message = {
            "id": article.id,
            "sub_source_id": article.sub_source_id
        }
        #
        # Redis did not remove the ack message automatic
        # when the element is full, it remove the oldest
        #
        redis_client.xadd(name=article_stream_name, fields=message, maxlen=10)
        # redis_client.xgroup_create(name=article_stream_name, groupname=article_group_name)
        # redis_client.publish(channel=article_stream_name, message="hello world!")
    except Exception as e:
        logger.error("write stream error:", e)

在加入maxlen参数之前,该元素可以成功写入Redis。但是,当我将maxlen参数设置为10后,在Redis检查流元素时,它仍然有90多个元素。我猜可能是Redis使用了旧的创建者配置。于是我尝试删除流并重新创建它,但仍处于这种情况。我做错了什么?为什么maxlen参数没有产生任何效果?

1个回答

2

默认情况下,redis-py 中的 xadd 命令的 approximate 参数被设置为 True。这意味着您将无法获得精确的长度修剪,并且可以获得更好的性能。如果您需要精确的长度,请尝试使用以下命令:

redis_client.xadd(name=article_stream_name, fields=message, maxlen=10, approximate=False)

xadd的源代码: https://redis-py.readthedocs.io/en/stable/_modules/redis/client.html#Redis.xadd


该链接提供了xadd的源代码。

大致参数默认为True,这意味着当流长度大于10时,Redis不会立即修剪流,但可以获得更好的性能。如果设置为False,则会立即修剪流,但性能较低。这样说对吗?@Simon Prickett - Dolphin
2
@Dolphin,无论如何它都会立即修剪,但当该参数为True时,它会修剪到一个大约的数字。这是近似的,因为它删除底层数据结构树中最接近所需条目数量的整个节点,而不是解析整个树直到找到精确的数字,这样做的性能较差。 - Simon Prickett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接