在Redis中存储大量类似项目的随机列表

时间:2011-02-25 04:14:08

标签: redis data-storage high-load

Redis 2.0.3

我需要在Redis中存储大量项目。每个项目都是一个短字符串(少于256个字符)。

我需要在列表上执行两项操作:

  • 添加许多(数千到数百万)相同的项目。 (一天几次)

  • 从列表中删除一个随机项。没有必要随意“公平”。任何“足够好”的方法都可以。 (每秒高达数百次)

我没有足够的RAM来逐个存储列表中的所有项目。

我认为我需要分批存储物品,名称和柜台。 (将有数千个不同的项目,更像是数百个。)

但我不确定如何有效地组织这个。

任何提示?

1 个答案:

答案 0 :(得分:0)

好吧,既然没有人能帮助我,这是一个“愚蠢”的解决方案,用伪代码。

  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
    
  3. 请提出更好的解决方案,如果它存在,我仍然在研究Redis,可能会错过一些明显的解决方案。

    我怀疑LOCK中的UNLOCK / insert_items()可能是多余的,可以用MULTI / EXEC替换,但我认为需要LOCK中的UNLOCK / maybe_get_next_item()工作正常(我不知道如何替换为MULTI / EXEC)...