在redis中使用有序集的替代数据模型(对于Django / Python项目)

时间:2016-09-16 13:29:18

标签: python redis

我有一个网络应用程序,用户发布短信供其他人阅读(类似Twitter)。

我需要保存50个最新的message_id和海报的user_id对(稍后进行处理)。我使用redis后端并意识到我可以在排序集中保存这50个最新对:user_id作为值,message_id作为分数。

现在可以重复user_id,我需要将NX标记设置为true。根据{{​​3}},这可以确保将新成员添加到已排序的集合中,而不是更新现有成员。这有帮助,因为如果同一用户多次发布消息,则新条目将添加到已排序集,而不是覆盖现有消息。这使数据保持清醒。

问题在于:我的应用程序使用python,并且在redis 2.8.4(版本I' m using)中引入了NX标志。

那么我有什么选择可以使用redis有效地保存50个最新的message_iduser_id对?请指教。

在排序集中切换message_iduser_id作为值和分数对我不起作用。为什么?因为要确保排序集只保存最新的50个条目,所以如果设置的基数超过50,我需要zremrangebyrank。仅当message_idscore而不是可重复时才有效user_id。我希望这是有道理的。

1 个答案:

答案 0 :(得分:1)

首先,我认为你误解了" NX"国旗的意思。这是排序的 - 您可以使用不同的分数来获得相同的值。 " NX" flag仅确保,如果您尝试使用不同的分数再次添加值,则不会修改现有元素的分数。

您需要使用redis列表。您只需添加以下值:

user_id:score_id(或序列化),

with:http://redis.io/commands/lset

然后使用:http://redis.io/commands/lrange读取最后50个元素,

有时使用:http://redis.io/commands/ltrim来修剪列表。