복붙노트

[REDIS] '메시지'청취자에 레디 스를 제거하는 방법

REDIS

'메시지'청취자에 레디 스를 제거하는 방법

전형적인 레디 스 채팅 예를 들어 이런 식으로 뭔가를 갈 것입니다 (단지 하나의 예를 들어 https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js 참조)

io.sockets.on('connection', function (client) { //websocket connection

  redis1.subscribe("chat");

  redis1.on("message", function(channel, message) {
      console.log(message);
      client.send(message);
  });

  client.on('message', function(msg) {
    redis2.publish("chat",msg.message);  
  });

  client.on('disconnect', function() {
      redis1.quit();
  });
});

그러나 여기에 문제는 클라이언트의 분리 '는 redis1.on ('메시지 ', FUNC가 () {}) 리스너가 여전히 연결되어있는 경우이다. 콘솔 메시지를 출력 할 것입니다. 하나 redis1의 이벤트 listners를 검사한다면, 그들은 여전히 ​​익명 함수 듣기를 찾을 것입니다.

이 문제는 더 redis1.off (...) 기능이 없다는 것입니다. 그럼, 어떻게 하나의 바인딩을 해제 / 탈퇴 / 삭제 / 제거 레디 스 메시지 리스너를합니까?

참고 :이 다른 웹 소켓에 연결된 사용자의 레디 스 연결을 중단하기 때문에 하나는 그냥 redis1.end ()를 할 수 없습니다.

해결법

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

    1.내가 노드 REPL에서 장난에 의해 발견 한 것을 유일한 해결책은 가입 할 수 redis.on () 함수를 사용하지 않는 것입니다. 대신에, 하나는 redis.addListener ()와 redis.removeListener () 함수를 사용해야합니다. 또한, 하나의 이벤트 콜백으로 익명 함수를 사용하지 않아야합니다. 하나는 같은 것을 할 수 있습니다 :

    내가 노드 REPL에서 장난에 의해 발견 한 것을 유일한 해결책은 가입 할 수 redis.on () 함수를 사용하지 않는 것입니다. 대신에, 하나는 redis.addListener ()와 redis.removeListener () 함수를 사용해야합니다. 또한, 하나의 이벤트 콜백으로 익명 함수를 사용하지 않아야합니다. 하나는 같은 것을 할 수 있습니다 :

    var callback = function(channel, message){
    
    };
    
    redis1.addListener('message', callback);
    
    client.on('disconnect', function(){
      redis1.removeListener('message', callback);    
    })
    
  2. from https://stackoverflow.com/questions/11617811/how-to-remove-redis-on-message-listeners by cc-by-sa and MIT license