2011-02-25 2 views
0

Redis 2.0.3Redis에서 유사한 항목의 엄청난 무작위 목록 저장

거대한 항목 목록을 Redis에 저장해야합니다. 각 항목은 짧은 문자열 (256 자 미만)입니다.

나는 목록에 두 가지 작업을 수행해야합니다

  • 이 (백만에 수천) 동일한 항목을 다수 추가. (하루에 여러 번)

  • 목록에서 하나의 임의 항목을 제거하십시오. "공정한"무작위를 가질 필요는 없습니다. "충분히 좋은"접근 방식이 가능합니다. (초당 최대 수백 번)

목록에있는 모든 항목을 하나씩 저장하기에 충분한 RAM이 없습니다.

나는 배치, 이름 및 카운터에 항목을 저장해야한다고 생각합니다. (몇 천 개가 넘는 별개의 항목이있을 것이며, 수백 개와 비슷할 것입니다.)

그러나 이것을 효과적으로 구성하는 방법을 모르겠습니다.

힌트가 있습니까?

답변

0

아무도 나를 도울 방법이 없으므로 의사 코드에서 "멍청한"해결책을 제시합니다. 만약 존재한다면 난 아직도 레디 스를 groking있어,

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 
  • 삽입 새로운 요소

    function insert_items(item_name, amount) 
        LOCK -- As explained in SETNX docs 
        SADD "items-set" (item_name) 
        INCRBY ("items:" + item_name) amount 
        UNLOCK 
    end 
    
  • 더 나은 솔루션을 제안 마십시오, 그리고 :

    1. 임의 요소를 가져옵니다 명백한 것을 놓칠지도 모른다.

      나는 insert_items()에서 LOCK/UNLOCK가 불필요 할 수 있으며 MULTI/EXEC로 대체 될 수 있다는 생각,하지만 난 제대로 (내가로 대체하는 방법을 알고하지 않는 일을 maybe_get_next_item()LOCK/UNLOCK을 위해 필요하다고 생각 MULTI/EXEC) ...

    +0

    동일한 항목의 수가 항목을 가져올 기회에 아무런 역할을하지 않기 때문에 여기의 확률은 비뚤어집니다. 이것은 나의 특별한 유스 케이스에서는 괜찮다. –

    +0

    2.2에서 더 나은 접근법은 WATCH를 사용하는 것입니다. http://stackoverflow.com/questions/5118807/redis-how-to-atomically-remove-an-item-from-set-if-a-counter-in-another -key-is-b –