2014-10-20 2 views
1

나는 값을 추가하고 거기에 머무르기를 원하는 시간을 지정할 수있는 Redis (Node 사용)의 배열을 원합니다. 그 시간 제한 후, 그들은 삭제해야하며, 이상적으로 뭔가를 부를 수 있도록 방금 남은 것을 안다. 전의. 나는 120 초가 걸린 요청을받을 수 있습니다. 그래서 그 값을지도에 추가하고 그 값을 지우고 싶습니다.Redis : 특정 길이의 배열에 추가 하시겠습니까?

더 좋은 방법이 있나요? 나는 EXPIRE를 사용하는 것을 생각했다. 그러나 그것은 단지 배열에있는 요소가 아닌 키에 대한 것으로 보인다.

어떤 생각이라도 좋을 것입니다.

내가 뭐하는 거지입니다 :

app.get('/session/:length', function(req, res) { 
    var length = parseInt(req.param('length'), 10); 

    addToArray(length, ip) 
    var ip = req.connection.remoteAddress; 

    res.json({ip: ip, length: length}); 

});

기본적으로 배열에 추가 할 때 전달되는 시간 동안 배열에 보관하기를 원합니다. 따라서 30 초를 말하면 30 초 동안 배열에있는 다음 사라집니다. , 콜백을 호출합니다. 어쩌면이 문제를 해결할 더 좋은 방법이 있을까요?

내가 지금하는 일은 배열에 추가 시간과 ip, 시간을 주기적으로 유지하고 주기적으로 배열 검사와 삭제를 반복하는 것이지만 자동으로이를 수행하는 것이 가능할 수도 있습니다.

+0

당신이하려는 일에 대한 예가 있습니까? 어쩌면 지금까지 가지고있는 것일까 요? – Termato

답변

2

Redis에서 자동으로 수행 할 수있는 방법은 없지만 이러한 유형의 문제에 대한 일반적인 접근 방법은 Redis 정렬 된 세트를 사용하는 것입니다. 귀하의 경우, IP를 회원의 가치로 설정하고 만료 시간 (현재 + 살 시간)을 에포크 표현을 사용하여 점수로 설정하십시오.

주기적으로 반복하는 대신 한 번씩 ZREMRANGEBYSCORE을 호출 할 수 있습니다.

집합 구성원은 고유하므로 각 IP를 한 번만 저장할 수 있습니다. 괜찮 으면 IP 히트마다 IP 점수를 업데이트하십시오. 그렇지 않으면 IP와 타임 스탬프를 연결하여 구성원 값을 고유하게 만드십시오.

마지막으로 "만료되지"않은 IP를 얻으려면 ZRANGEBYSCORE를 사용하여 점수 (만료 시간)가 현재보다 높은 멤버를 얻으십시오. 마찬가지로 ZREMRANGEBYSCORE를 사용하여 삭제하기 전에 앞서 언급 한 콜백 논리에 대해 만료 된 키를 가져옵니다.

관련 문제