노동자end () 는 Redis의 모든 키를 삭제하지 않습니다

4682 단어 coffee-resque

묘사

실행 중인worker를 호출할 때worker.end()redis의 모든 관련 키를 삭제하지 않습니다.문제는 node redis library documentation에 따라 여러 키를 삭제하는 방법은
client.del(key1, key2, ..., keyn, callback)
그러나 커피resque에서 여러 키는 passed as an array가 아니라 individual parameters였다.
다음은 내가 monitor를 호출했을 때redisworker.end() 명령의 추적이다.
내 복구를 적용하기 전에
1351551290.814186 "srem" "resque:workers" "node:98309:temp"
1351551290.814216 "del" "resque:worker:node:98309:temp,resque:worker:node:98309:temp:started,resque:stat:failed:node:98309:temp,resque:stat:processed:node:98309:temp"
첫 번째 매개 변수 (수조로) 로 전달되는 모든 매개 변수는 join, 합쳐져 있기 때문에, Redis는 이를 긴 키로 간주합니다.
제 복구를 응용해서...
1351554029.511565 "srem" "resque:workers" "node:98400:temp"
1351554029.511627 "del" "resque:worker:node:98400:temp" "resque:worker:node:98400:temp:started" "resque:stat:failed:node:98400:temp" "resque:stat:processed:node:98400:temp"
모든 키

토론 #1

를 삭제했습니다. 이상합니다.보기 code 명령은 수조나 가변 길이의 매개 변수 목록을 사용할 수 있을 것 같습니다.아마도 나는 node redis의 실현을 더욱 깊이 이해해야 할 것 같지만, 이것이 바로 내가 대략적으로 관찰할 때 본 상황이다.나는 너의 결과를 의심하지 않지만 이 간단한 스크립트를 실행하면
redis = require('redis').createClient()

multi = redis.multi()
multi.set 'one', '1'
multi.set 'two', '2'
multi.exec (err, reply) ->
  redis.del ['one', 'two'], -> redis.end()
알겠습니다.
1351559148.358883 "MULTI"
1351559148.359004 "set" "one" "1"
1351559148.359015 "set" "two" "2"
1351559148.359021 "EXEC"
1351559148.359262 "del" "one" "two"
{
  "name"         : "test",
  "version"      : "0.0.1",
  "private"      : true,
  "dependencies" : { "redis": "0.8.1" }
}
나는 일꾼을 끝낼 때 모니터가 무엇을 표시하는지 resque로 빠른 테스트를 할 것이다.
감사합니다

토론 #2

. 확인했습니다. 저는 당신과 같은 일을 보았습니다. 이상에 근거하여 저는 상당히 곤혹스러웠습니다.이 정리 논리를 둘러싼 테스트도 실패했다.이 PR

토론 #셋

을 통합하기 전에 깊이 들어가겠습니다. 이것은 흥미롭습니다. Worker#end에 제공된 리셋이 정의되지 않으면 노드 Redis send 명령에 전달되는 매개 변수는 하나의 요소를 가진 2d 그룹입니다. 예를 들어 다음과 같습니다.
[ [ 'resque:worker:node:79651:test',
    'resque:worker:node:79651:test:started',
    'resque:stat:failed:node:79651:test',
    'resque:stat:processed:node:79651:test' ] ]
만약 내가 리셋을 제공한다면,del는 그룹args와 함께 일할 것입니다.이것은 냄새를 보니 벌레 같다.

토론 #4

이것problem입니다.보기에 리셋을 선택할 수 있을 것 같아서 더 이상 선택할 수 없을 것 같다.README 에서 매개 변수의 예로 수조를 사용해도 리셋을 제공하지 않으면 작업을 할 수 없습니다.하나 입력issue했지만 어레이 방법이 더욱 최적화되었기 때문에 다음과 같은 작업을 수행할 수 있습니다.
end: (cb) ->
  @running = false
  @untrack()
  @redis.del [
    @conn.key('worker', @name)
    @conn.key('worker', @name, 'started')
    @conn.key('stat', 'failed', @name)
    @conn.key('stat', 'processed', @name)
  ], (err, reply) -> cb() if cb
이것은 시험을 다시 통과시켰다.
확장키와 관련된 내용을 인용한 링크가 있기를 바랍니다.오, 그래, 내가 거기서 타 죽을지도 몰라;)

토론 #5

@steelThread 이 문제를 제때에 관심을 가지고 깊이 연구해 주셔서 감사합니다!정말 고마워요.
나는 방금 첫 번째 댓글에서 끊어진 링크를 업데이트했다.이 점을 지적하기 위해서다.https://github.com/bnoguchi/redis-node#clientdelkey1- key2 - keyn 콜백 - 키 삭제 예제
너의 해결 방안은 보기에 괜찮다.npm의 업데이트를 기대합니다.

토론 #6

v0에 발표.1.8 이 문제를 해결한다.나는 네가 지금 분명히 알고 있다고 생각한다. 우리가 사용하는 것은 서로 다른 Redis 클라이언트이다. 이것이 바로 네가 위에서 언급한 것이다.

좋은 웹페이지 즐겨찾기