使用Redis

时间:2016-06-27 16:50:20

标签: python redis stack persistence redis-py

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

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

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

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

  3. 所以,我基本上在寻找一种方法来保存一个空列表的密钥,该列表不涉及上述两种方法中所需的簿记。感谢。

1 个答案:

答案 0 :(得分: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 ...

在上面的例子中,app1是由app逻辑动态创建的,你用一个有意义的字符串来附加它们,表示该键的含义。

通过这种方式,您将始终可以控制所放置的按键,并且永远不会遇到按键碰撞。

希望这有帮助。

相关问题