0

我正在使用 redis-py 和 Redis 列表数据类型实现堆栈数据结构。当对应的列表数据类型为空时,我不清楚如何处理。默认 Redis 行为似乎是,一旦列表为空,相关键就会被删除。例如,当我在 Python 端弹出或清除堆栈数据结构中的所有元素时,会在 Redis 上命中空列表案例。基本上,我的设置是我的代码中有堆栈对象,它调用 Redis 列表上的操作。例如,当堆栈对象的客户端执行 stack.pop() 时,堆栈对象然后使用 redis-py 在 Redis 中的相应列表上调用 BRPOP。另外,在我的设置中,stack 对象具有 key 属性,它是 Redis 中相关列表的键。

到目前为止,我已经考虑了两种可能的解决方案:

  1. 永远不要完全清空 Redis 列表。至少维护列表中的一个元素。从客户端的角度来看,如果 Redis 列表仅包含 1 个元素,则堆栈为空。这种方法有效,但我主要不喜欢它,因为它涉及跟踪推送/弹出的元素数量。

  2. 如果列表为空,则删除相关键。在后续推送时,只需在 Redis 上创建一个新列表。这种方法也有效,但这里增加的复杂性是我无法确定其他人是否使用与我的堆栈对象相同的键在 Redis 上创建了 k,v 对。

所以,我基本上是在寻找一种方法来保留一个带有空列表的键,它不涉及上述两种方法所需的簿记。谢谢。

4

1 回答 1

1

您的第二个解决方案是最合适的。

是的,您必须维护命名约定,这对于任何无 sql 数据库或键值存储都非常基本。您必须控制您输入的密钥。如果您没有该控制权,那么在一段时间内您不知道哪个密钥用于哪个目的。为了达到同样的效果,您可以在输入的所有键中添加一些有意义的字符串前缀。

例如,如果我想为单个用户 user1 存储 3 个哈希图,我会这样做

hmset ACTIONS_user1 a 10 b 20 ...
hmset VIEWS_user1 home_page 4 login 10 ...
hmset ALERTS_user1 daily 5 hourly 12 ...

在上面的示例中,user1 是由应用程序逻辑动态创建的,您可以在它们后面附加一个有意义的字符串,表示该键所包含的内容。

通过这种方式,您将始终可以控制您输入的键,并且您将永远不会遇到键冲突。

希望这可以帮助。

于 2016-06-28T06:45:17.430 回答