存储Redis的类似项目的巨大随机列表

Redis的2.0.3

我需要存储一个巨大的Redis的产品清单。 每个项目都是短字符串(少于256个字符)。

我需要做的就行了两个操作:

  • 许多(几千到一万元)添加相同的项目。 (每日数次)
  • 从列表中删除一个随机项。 这是没有必要有“公平”随机的。 任何“足够好”的方法就可以了。 (最多至几百倍的第二)

我没有足够的RAM由一个存储在一个列表中的一个的所有项目。

我想,我需要存储在批次名称和物品柜。 (将有多达数千个不同的物品,更像几百)。

但我不知道如何有效地组织这一点。

任何提示?

--------------解决方案-------------

那么,既然没有人上去帮忙我,这里是一个“哑巴”的解决方案,在伪代码。

  1. 获取随机元素:

    function maybe_get_next_item()
    item_name = SRANDMEMBER "items-set"
    item_key = "items:" + item_name

    new_item_count = DECR (item_key)

    if new_item_count < 0 then
    LOCK -- As explained in SETNX docs
    new_item_count = GET (item_key) -- More added while we were locking?
    if new_item_count and new_item_count < 0 then
    SREM (item_name) -- No, expire it
    end
    UNLOCK
    end

    if new_item_count and new_item_count >= 0 then
    return item_name
    end

    return false -- this item not found
    end

    function get_next_item()
    item_name = maybe_get_next_item()
    while not item_name and (SCARD "items-set" > 0) do
    item_name = maybe_get_next_item()
    end
    return item_name -- false if all items are expended
    end

  2. 插入新元素

    function insert_items(item_name, amount)
    LOCK -- As explained in SETNX docs
    SADD "items-set" (item_name)
    INCRBY ("items:" + item_name) amount
    UNLOCK
    end

请不要提出一个更好的解决方案,如果它存在,我还是groking Redis的,并且可能会错过一些东西明显。

我怀疑LOCK / UNLOCKinsert_items()可能是多余的,可以替换MULTI / EXEC ,但我认为这是需要LOCK / UNLOCKmaybe_get_next_item()正常(我不知道如何与更换工作MULTI / EXEC )...

分类:Redis的 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.566 (s). 10 q(s)