[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.이미 만료 된 키를 포함하지 만료 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.는 반환을하지 않는 시간이 만료 키의 크기를 만료됩니다.
는 반환을하지 않는 시간이 만료 키의 크기를 만료됩니다.
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를 인덱스입니다).
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
'REDIS' 카테고리의 다른 글
[REDIS] 레디 스`SCAN` : 방법과 일치하는 적절한 시간에 최종 결과를 확인 할 수 키를 newcomming 사이의 균형을 유지하기 위해? (0) | 2020.02.13 |
---|---|
[REDIS] Redigo 레디 스 풀 정말 전역 변수로되어 있습니까? (0) | 2020.01.26 |
[REDIS] 레디 스 : 이상한 프로토콜 / 네트워크 오류 (0) | 2020.01.26 |
[REDIS] Laravel 5.1 세션 및 Socket.IO + 레디 스 - 사용자의 기록 된 IN에 알림 보내기 (알려진) 사용자 및 그룹 (0) | 2020.01.26 |
[REDIS] 어떻게 경고 사용자에게 때 resque 작업 완료 (0) | 2020.01.26 |