Redis吃了node.js的内存

时间:2014-08-19 09:48:52

标签: node.js memory-leaks redis data-storage

我正在尝试使用redis作为存储,但它会占用我的记忆。我有几秒钟的数据,我存储在redis中。这个数据不断变化,我假设因为它改变了不同的值而不是更新redis中的当前值。 我要做的是要么找到一种方法来删除旧值或者在数据进入时更新值。我不能使用flushall或简单清除因为我需要最新的数据信息以保持redis。这就是我尝试在函数中实现client.expire但是因为这个函数被调用所以经常被卡在一个永无止境的刷新系统循环中。 这是我正在处理的代码片段:

function in_redis(temp_streamName, temp_accelX, temp_accelY, temp_accelZ, temp_geoLat, temp_geoLon, temp_time)
{
    var child_info = child.fork(__dirname + '/child_proccessors/child_db'); // Acces the sub process in the folder specified
    // console.log(jsonResult);
    // console.log("in-redis-streamName: "+ temp_streamName);
    // console.log("in-redis-temp_accelX: "+ temp_accelX);
    // console.log("in-redis-temp_accelY: "+ temp_accelY);
    // console.log("in-redis-temp_accelZ: "+ temp_accelZ);
    // console.log("in-redis-temp_geoLat: "+ temp_geoLat);
    // console.log("in-redis-temp_geoLon: "+ temp_geoLon);
    // console.log("in-redis-timestamp: "+ temp_time);

    client.hmset(temp_streamName,"streamName",temp_streamName,"AccelX",temp_accelX,"AccelY",temp_accelY,"AccelZ",temp_accelZ,"GeoLat", temp_geoLat, "GeoLon", temp_geoLon, "Timestamp",temp_time, redis.print);
    client.hget(temp_streamName, "streamName", redis.print); //printing redis data
    client.hget(temp_streamName, "AccelX", redis.print);  //printing redis data
    client.hget(temp_streamName, "AccelY", redis.print);  //printing redis data
    client.hget(temp_streamName, "AccelZ", redis.print);  //printing redis data
    client.hget(temp_streamName, "GeoLat", redis.print);  //printing redis data
    client.hget(temp_streamName, "GeoLon", redis.print);  //printing redis data
    client.hget(temp_streamName, "Timestamp", redis.print);  //printing redis data

    //send the data to the client server using the sockets
    io.sockets.emit('Sensor', {"streamName": temp_streamName, "AccelX": temp_accelX, "AccelY": temp_accelY, "AccelZ": temp_accelZ, "GeoLat":temp_geoLat, "GeoLon":temp_geoLon, "Timestamp":temp_time});
    //send the data to the child process so it can be stored in mongo
    child_info.send({"streamName": temp_streamName, "AccelX": temp_accelX, "AccelY": temp_accelY, "AccelZ": temp_accelZ, "GeoLat":temp_geoLat, "GeoLon":temp_geoLon, "Timestamp":temp_time});
}

任何帮助都会很棒

1 个答案:

答案 0 :(得分:1)

如果要更新值,只需对哈希使用相同的名称,而不是每次都生成不同的temp_streamName。

如果您希望在任何情况下都创建新值,则可以始终使用expire命令并将tempristreamName哈希设置为expiration(在发出hmset命令之后)。该值将在您设置的时间后过期。

第三种选择是让redis耗尽内存并在内存满时释放最少使用的值。您需要更改redis配置文件中的配置。如果你想使用redis来存储瞬态和永久数据,那么最后一个选项并不是一个好主意。