0

Redis 2.0.3

アイテムの膨大なリストをRedisに保存する必要があります。各項目は短い文字列(256文字未満)です。

リストで2つの操作を行う必要があります。

  • 多数(数千から百万)の同一アイテムを追加します。(一日に何度も)

  • リストからランダムなアイテムを1つ削除します。「公平な」ランダムである必要はありません。「十分に良い」アプローチならどれでもかまいません。(1秒間に最大数百回)

すべてのアイテムを1つずつリストに保存するのに十分なRAMがありません。

アイテムをまとめて、名前とカウンターで保管する必要があると思います。(数百のような、最大数千の異なるアイテムがあります。)

しかし、これを効果的に整理する方法がわかりません。

ヒントはありますか?

4

1 に答える 1

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
    

存在する場合は、より良い解決策を提案してください。私はまだRedisを探していますが、明らかな何かを見逃している可能性があります。

LOCK/ UNLOCKinは不要で、 /に置き換えるinsert_items()ことができると思いますが、/ inが正しく機能するために必要だと思います(/に置き換える方法がわかりません)...MULTIEXECLOCKUNLOCKmaybe_get_next_item()MULTIEXEC

于 2011-02-25T14:52:16.400 に答える