복붙노트

[REDIS] 레디 스에 정보 명령에 의해 나열 만료되는 키의 수는 내가 보는 것과 일치하지 슬레이브

REDIS

레디 스에 정보 명령에 의해 나열 만료되는 키의 수는 내가 보는 것과 일치하지 슬레이브

A는 3.2.4 서버 레디 스에 대해 내가 레디 스-CLI에서 정보 명령을 실행하면 만료 된 날이를 보여줍니다

= 223,518 만료

나는 다음 키 * 명령을 실행하고 각 키의 TTL을 요청하고, 단지 TTL> 0 키를 인쇄 할 때, 나는 단지 몇 백을 참조하십시오.

나는이 만료하는 것은 만료 키의 수의 수입니다하지만 난 심지어이 숫자의 크기 순서에서 아닙니다 생각했다.

누군가가 전달하는 의미 만료 정확히 규명 할 수 있습니까? 이 포함되어 있습니까 모두는 - - 만료 이전에 만료되지만 아직 키를 퇴거하지?

최신 정보:

여기가 만료되는 키의 수를 계산하는 방법이다 :

  task count_tmp_keys: :environment do
    redis = Redis.new(timeout: 100)
    keys = redis.keys '*'
    ct_expiring = 0

    keys.each do |k|
      ttl = redis.ttl(k)
      if ttl > 0
        ct_expiring += 1
        puts "Expiring: #{k}; ttl is #{ttl}; total: #{ct_expiring}"
        STDOUT.flush
      end
    end

    puts "Total expiring: #{ct_expiring}"
    puts "Done at #{Time.now}"
  end

나는 그것을 보여줍니다이 스크립트를 실행했을 때 나는 78의 만료 총을 가지고

키 = 10237963 = 224098, avg_ttl = 0 만료 : 나는 정보를 실행하면 DB0 말한다

224098 너무 큰 78 이상이기 때문에, 나는 매우 혼란 스러워요. 키 만료 모든 225K의 목록을 얻기 위해 나를 위해 더 좋은 방법은 아마도 있습니까?

또한, 어떻게 내 평균 TTL이 0이다? 당신은 그것을가 0이 될 것으로 기대하지 않을까요?

최신 정보

나는 100 % 로컬이 상황의 repro 수 새로운 정보와 간단한있다!

repro 수하려면 설정 두 노트북에서 로컬 프로세스를 레디 스. 하나 다른 노예를 확인합니다. 슬레이브 과정에서 다음을 설정합니다 :

config set slave-serve-stale-data yes
config set slave-read-only no

이제, 슬레이브 (안 마스터) 및 실행에 연결 :

set foo 1
expire foo 10

10 초 후에, 당신은 더 이상 액세스 foo는 할 수 없습니다 만, 정보 명령은 여전히 ​​0의 평균 TTL로 만료 한 키를 가지고 있음을 보여줍니다.

누군가가이 동작을 설명 할 수 있습니까?

해결법

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

    1.이미 만료 된 키를 포함하지 만료 TTL 기존 키가 포함되어 만료됩니다. 예 (간결성에 대한 정보 명령의 추가 정보를 생략) :

    이미 만료 된 키를 포함하지 만료 TTL 기존 키가 포함되어 만료됩니다. 예 (간결성에 대한 정보 명령의 추가 정보를 생략) :

    127.0.0.1:6379> flushall
    OK
    127.0.0.1:6379> SETEX mykey1 1000 "1"
    OK
    127.0.0.1:6379> SETEX mykey2 1000 "2"
    OK
    127.0.0.1:6379> SETEX mykey3 1000 "3"
    OK
    127.0.0.1:6379> info
    # Keyspace
    db0:keys=3,expires=3,avg_ttl=992766
    127.0.0.1:6379> SETEX mykey4 1 "4"
    OK
    127.0.0.1:6379> SETEX mykey5 1 "5"
    OK
    127.0.0.1:6379> info
    # Keyspace
    db0:keys=3,expires=3,avg_ttl=969898
    127.0.0.1:6379> keys *
    1) "mykey2"
    2) "mykey3"
    3) "mykey1"
    127.0.0.1:6379> 
    

    상황에 당신이 https://github.com/antirez/redis/issues/2861 당, 노예에 키 만료에 대한 요구하고 있음을 감안할 때 :

    그리고 https://groups.google.com/forum/#!topic/redis-db/NFTpdmpOPnc 당 :

    따라서, 정보 명령이 노예에서 다르게 동작 것으로 예상 할 수있다.

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

    2.는 반환을하지 않는 시간이 만료 키의 크기를 만료됩니다.

    는 반환을하지 않는 시간이 만료 키의 크기를 만료됩니다.

    3.2.4의 소스 코드

    long long keys, vkeys;
    
    keys = dictSize(server.db[j].dict);
    vkeys = dictSize(server.db[j].expires);
    if (keys || vkeys) {
        info = sdscatprintf(info,
            "db%d:keys=%lld,expires=%lld,avg_ttl=%lld\r\n",
            j, keys, vkeys, server.db[j].avg_ttl);
    }
    

    단지 server.db [J] .expires의 크기를 계산한다. (주 j를 인덱스입니다).

  3. from https://stackoverflow.com/questions/45844944/number-of-expiring-keys-listed-by-info-command-on-redis-slave-not-consistent-wit by cc-by-sa and MIT license