[REDIS] 레디 스에서 Node.js를의 setTimeout의 반환 값을 저장
REDIS레디 스에서 Node.js를의 setTimeout의 반환 값을 저장
나는 Node.js를에서의 setTimeout을 사용하고 있는데 숫자 대신 객체를 반환 클라이언트 쪽의 setTimeout 다르게 행동하는 것 같다. 나는 레디 스에이를 저장하기를 원하지만 레디 스에만 저장 문자열 이후, 나는 객체를 문자열로 변환해야합니다. 그러나 JSON.stringify을 사용하여 원형 기준에서 에러가 발생. 내가 레디 스에서 그것을 가져 그것에 사항 clearTimeout를 호출 할 수 있도록하려면 어떻게 레디 스에서이 객체를 저장할 수 있습니까?
해결법
-
==============================
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.나는 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.시간 초과는 서버가 재시작에 걸쳐 지속되지 않을 필요로 할 때이 코드가 사용됩니다
시간 초과는 서버가 재시작에 걸쳐 지속되지 않을 필요로 할 때이 코드가 사용됩니다
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) }); });
from https://stackoverflow.com/questions/11300654/storing-the-return-value-of-node-js-settimeout-in-redis by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 로깅 레디 스 (0) | 2020.01.16 |
---|---|
[REDIS] 나는 파일 / 모듈 간의 레디 스 연결을 공유해야 하는가? (0) | 2020.01.16 |
[REDIS] 윈도우 7 64 비트 XAMPP에 phpredis (0) | 2020.01.16 |
[REDIS] sidekiq가 레디 스 서버에 연결되어 있는지 확인하는 방법? (0) | 2020.01.15 |
[REDIS] 얼마나 자주 Booksleeve 연결 / 폐해야합니까? (0) | 2020.01.15 |