我开始使用Redis,并遇到以下问题。Redis中的自动增量
我有一堆物体,比方说我的系统中有Messages
。每一个新的User
连接时,我做到以下几点:
INCR
一些全局变量,比方说g_message_id
,并保存INCR的返回值(的g_message_id
当前值)。LPUSH
将新消息(包括id
和实际消息)放入列表中。
其他客户端使用值g_message_id
来检查是否有任何新消息要获取。
问题是,一个客户端可以INCR
的g_message_id
,但没有时间另一个客户端试图读取它之前LPUSH
消息,假设有一个新的消息。
换句话说,我正在寻找一种方法来完成在SQL中添加行,以及使用自动递增索引的方式。
注意:
我不能使用列表索引,因为我经常要删除列表中的部分,使之无效。
我的现实情况稍微复杂一些,这是一个更简单的版本。
目前的解决方案:
最好的解决方案我已经出来,我打算做的是使用WATCH
和Transactions
尝试和执行“自动增量”自己。
但是在Redis中这是一个很常见的用例,我很惊讶没有现成的答案,所以我担心我做错了什么。
有趣。这导致了一个相关的问题:当客户端使用其“g_new_message_flag”副本轮询服务器时,服务器如何从列表中检索消息?它可以根据“g_new_message_flag”和用户标志之间的差异取出一些消息,但是如果在减法操作和LPOP之间添加新消息,将弹出错误的消息数量。 – 2011-03-16 18:35:51
我明白你的意思 - 如果客户端应该弹出所有可用的消息并将列表清零,那就更加棘手。我会用一些想法更新我的答案。 – samplebias 2011-03-16 18:58:59
实际上,我不希望客户端删除邮件,只是获取最新邮件。我有几个不同的客户端(可能)有不同的g_msg_queue值,每个客户端都需要阅读已经到达的最新消息。该列表仅由后台进程定期删除(例如每天一次)。 – 2011-03-16 19:12:24