복붙노트

[REDIS] 레디 스에서 Node.js를의 setTimeout의 반환 값을 저장

REDIS

레디 스에서 Node.js를의 setTimeout의 반환 값을 저장

나는 Node.js를에서의 setTimeout을 사용하고 있는데 숫자 대신 객체를 반환 클라이언트 쪽의 setTimeout 다르게 행동하는 것 같다. 나는 레디 스에이를 저장하기를 원하지만 레디 스에만 저장 문자열 이후, 나는 객체를 문자열로 변환해야합니다. 그러나 JSON.stringify을 사용하여 원형 기준에서 에러가 발생. 내가 레디 스에서 그것을 가져 그것에 사항 clearTimeout를 호출 할 수 있도록하려면 어떻게 레디 스에서이 객체를 저장할 수 있습니까?

해결법

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

    1.당신은 레디 스에서 개체를 저장할 수 없습니다. 의 setTimeout 방법은 처리기 (개체 참조)를 반환한다.

    당신은 레디 스에서 개체를 저장할 수 없습니다. 의 setTimeout 방법은 처리기 (개체 참조)를 반환한다.

    하나 개의 아이디어는 메모리에 자신의 연관 배열을 만들고, 레디 스에서 인덱스를 저장하는 것입니다. 예를 들면 :

    var nextTimerIndex = 0;
    var timerMap = {};
    
    var timer = setTimeout(function(timerIndex) {
        console.log('Ding!');
    
        // Free timer reference!
        delete timerMap[timerIndex];
    }, 5 * 1000, nextTimerIndex);
    
    // Store index in Redis...
    
    // Then, store the timer object for later reference
    timerMap[nextTimerIndex++] = timer;
    
    // ...
    // To clear the timeout
    clearTimeout(timerMap[myTimerIndex]);
    
  2. ==============================

    2.나는 OP와 같은 일을 시도했습니다. 내 솔루션은 내 분리 처리기에서 제한 시간 안에 새 키에 대한 조건부 검사에 시간 제한을 설정했다 :

    나는 OP와 같은 일을 시도했습니다. 내 솔루션은 내 분리 처리기에서 제한 시간 안에 새 키에 대한 조건부 검사에 시간 제한을 설정했다 :

    redis.hset("userDisconnecting:" + userId, "disconnect", 1);
    
    setTimeout(function() {
        redis.hget("userDisconnecting:" + userId, "disconnect",
         function(err, result) {
            if (result.toString() === "1") {
               //do stuff, like notify other clients of the disconnect.
            }
        });
    }, 10000);
    

    클라이언트가 다시 연결할 때 물건이 참 분리 화재에 대한 요구 사항이 발생하지 않도록 다음, 나는 0으로 그 키를 설정 :

    redis.hset("userDisconnecting:" + userId, "disconnect", 0);
    

    시간 초과 자체는 서버가 다시 시작에 걸쳐 지속되지 않습니다,하지만 당신은 시작에 스위퍼 방법 발로에 의해 그 해결 할 수있다. 연결된 클라이언트는 꽤 빨리 "온라인"돌아올 것입니다.

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

    3.시간 초과는 서버가 재시작에 걸쳐 지속되지 않을 필요로 할 때이 코드가 사용됩니다

    시간 초과는 서버가 재시작에 걸쳐 지속되지 않을 필요로 할 때이 코드가 사용됩니다

    var timeouts = {};
    
    app.get('/', function (req, res) {
      var index = timeouts.length;
      timeouts[index] = setTimeout(console.log, 1000000, req.user.name);
    
      redis.set('timeout:' + req.user.name, index, function (err, reply) {
        res.end();
      });
    });
    
    app.get('/clear', function (req, res) {
      redis.get('timeout:' + req.user.name, function (err, index) {
       clearTimeout(timeouts[index]);
       delete timeouts[index];
       redis.delete('timeout:' + req.user.name);
       res.end();
      });
    });
    

    당신은 서버가 다시 시작에 걸쳐 지속적으로 시간 제한을해야하는 경우에, 당신은 레디 스의 모든 타이머 _idleStart 및 _idleTimeout 값을 저장해야하고, 매번 당신 서버 다시 시작을로드 할 수

    app.get('/', function (req, res) {
      var timeout = setTimeout(console.log, 1000000, req.user.name);
      var time = timeout._idleStart.getTime() + timeout._idleTimeout;
    
      redis.set('timeout:' + req.user.name, time, function (err, reply) {
        res.end();
      });
    });
    
    app.get('/clear', function (req, res) {
      redis.delete('timeout:' + req.user.name);
      res.end();
    });
    
    // Load timeouts on server start
    // *I know this is not the correct redis command*
    // *It's not accurate, only approx*
    redis.get('timeout:*', function (err, vals) {
      vals.forEach(function (val) {
        var time = val - new Date().getTime();
        setTimeout(console.log, time, username)
      });
    });
    
  4. from https://stackoverflow.com/questions/11300654/storing-the-return-value-of-node-js-settimeout-in-redis by cc-by-sa and MIT license