복붙노트

[REDIS] 효율성 : 레디 스 대 레디 스 문자열은 JSON을 표현하기 위해 해시?

REDIS

효율성 : 레디 스 대 레디 스 문자열은 JSON을 표현하기 위해 해시?

나는 레디 스에 JSON 페이로드를 저장할. 나는이 작업을 수행 할 수있는 2 가지 방법이 정말있다 :

내가 해시를 사용하는 경우, 값 길이가 예측하지 있음을 유의하십시오. 그들은 위에서 바이오 예로서 짧은 모든 것.

어느 것이 더 많은 메모리 효율적인가요? 문자열 키와 값을 사용하여, 또는 해시를 사용하고 계십니까?

해결법

  1. ==============================

    1.그것은 당신이 데이터에 액세스하는 방법에 따라 달라집니다

    그것은 당신이 데이터에 액세스하는 방법에 따라 달라집니다

    옵션 1 이동

    옵션 2 이동

    P.S : 엄지 손가락의 규칙으로서, 사용자의 사용 대부분의 경우에 적은 쿼리를 필요로하는 옵션 이동합니다.

  2. ==============================

    2.http://redis.io/topics/memory-optimization :이 기사는 여기에 많은 통찰을 제공 할 수 있습니다

    http://redis.io/topics/memory-optimization :이 기사는 여기에 많은 통찰을 제공 할 수 있습니다

    (대부분의 사용 사례에 대한 옵션 1과 같은 I 스포일러) 레디 스에서 객체의 배열을 저장하는 방법에는 여러 가지가 있습니다 :

    옵션 4는 일반적으로 바람직하지 않다. 옵션 1과 2는 매우 유사하며, 그들은 둘 다 꽤 일반적이다. 당신이 당신이 정말로에 대한 주요 핵심 네임 스페이스를 오염되지 신경 때 옵션 3을 사용하는 (중첩 여러 계층 등으로) 더 복잡한 객체를 저장할 수 있기 때문에이 옵션 1 (일반적으로)를 선호하는 (즉, 당신이 원하지 않는이 데이터베이스에서 키를 많이 할 수 있으며 TTL 같은 것들, 키 샤딩, 또는 무엇이든)에 대해 걱정하지 않는다.

    내가 여기서 뭔가 잘못을 가지고있는 경우, 코멘트를 떠나 저를 downvoting하기 전에 답을 개정 할 수 있도록 고려하시기 바랍니다. 감사! :)

  3. ==============================

    3.답변의 지정된 세트에 일부 추가 :

    답변의 지정된 세트에 일부 추가 :

    당신이 효율적으로 당신이 알고 있어야 레디 스 해시를 사용하려고하는 모든 경우에 우선 A 키를가 최대 수와 값 최대 크기를 계산 - 그들은 해시 최대-ziplist 값 또는 레디 스는 후드 아래에 실질적으로 보통의 키 / 값 쌍으로 변환됩니다 해시 최대-ziplist-항목을 탈출 그렇지 않은 경우. 레디 스 내부 각 일반적인 키 / 값 쌍 쌍당 +90 바이트를 사용하기 때문에 정말로 BAD이며 해시 옵션에서 후드 실연 (해시 MAX-ziplist 값, 해시 MAX-ziplist - 항목 참조).

    그것은 당신이 옵션이 시작 실수로 최대-해시 ziplist 값의 탈옥 경우는 내부 사용자 모델을 가지고 각 속성 당 90 바이트를 얻을 것을 의미합니다! (아래의 사실이 아닌 90 만 70 페이지의 콘솔 출력)

     # you need me-redis and awesome-print gems to run exact code
     redis = Redis.include(MeRedis).configure( hash_max_ziplist_value: 64, hash_max_ziplist_entries: 512 ).new 
      => #<Redis client v4.0.1 for redis://127.0.0.1:6379/0> 
     > redis.flushdb
      => "OK" 
     > ap redis.info(:memory)
        {
                    "used_memory" => "529512",
              **"used_memory_human" => "517.10K"**,
                ....
        }
      => nil 
     # me_set( 't:i' ... ) same as hset( 't:i/512', i % 512 ... )    
     # txt is some english fictionary book around 56K length, 
     # so we just take some random 63-symbols string from it 
     > redis.pipelined{ 10000.times{ |i| redis.me_set( "t:#{i}", txt[rand(50000), 63] ) } }; :done
     => :done 
     > ap redis.info(:memory)
      {
                   "used_memory" => "1251944",
             **"used_memory_human" => "1.19M"**, # ~ 72b per key/value
                .....
      }
      > redis.flushdb
      => "OK" 
      # setting **only one value** +1 byte per hash of 512 values equal to set them all +1 byte 
      > redis.pipelined{ 10000.times{ |i| redis.me_set( "t:#{i}", txt[rand(50000), i % 512 == 0 ? 65 : 63] ) } }; :done 
      > ap redis.info(:memory)
       {
                   "used_memory" => "1876064",
             "used_memory_human" => "1.79M",   # ~ 134 bytes per pair  
              ....
       }
        redis.pipelined{ 10000.times{ |i| redis.set( "t:#{i}", txt[rand(50000), 65] ) } };
        ap redis.info(:memory)
        {
                 "used_memory" => "2262312",
              "used_memory_human" => "2.16M", #~155 byte per pair i.e. +90 bytes    
               ....
        }
    

    TheHippo 응답의 경우, 옵션 하나에 대한 의견은 오해의 소지가있다 :

    hgetall / hmset / hmget 구조에 모든 필드 또는 여러 GET / SET 작업을해야하는 경우.

    BMiner 대답하십시오.

    세 번째 옵션은 <-MAX-ziplist 값을 가지고 최대 (ID)와 데이터 집합, 정말 실제로 재미이 솔루션이 O (N) 복잡성, 놀람, Reddis 같이 작은 해시를 저장하기 때문에 배열과 같은 길이 / 키 / 값의 용기 사물!

    그러나 당신은 당신이 매우 빠른 해시 최대-ziplist-항목을 깰 수있을 거라 걱정 안되며, 당신은 당신이 솔루션 번호 1에서 지금 실제로이 이동합니다.

    두 번째 옵션은 대부분의 가능성이 있기 때문에 질문 상태로 후드 아래에 네 번째 솔루션으로 이동합니다 :

    이미 말했듯 : 네 번째 솔루션은 확실히 각 속성 당 가장 비싼 70 바이트입니다.

    나의 제안 방법 등의 데이터 집합을 최적화하기 :

    당신은 두 가지 옵션을 가지고있다 :

  4. from https://stackoverflow.com/questions/16375188/redis-strings-vs-redis-hashes-to-represent-json-efficiency by cc-by-sa and MIT license