Redis建模预订

时间:2016-04-24 16:36:23

标签: node.js redis data-modeling key-value key-value-store

我正在从事个人项目以了解Redis。我试图将它用作管理酒店的数据库。我试图围绕如何管理预订。

问题是,有多个房间,每个房间可以有多个预订,存储日期和日期。我只是不确定如何对此进行建模,以便能够在给定的时间内有效地找到一个空房间。

目前,我一直在考虑为每个单独的房间存储已排序的预订,但这样我就必须逐个遍历房间,直到找到合适的房间。< / p>

欢迎任何输入。感谢

1 个答案:

答案 0 :(得分:2)

一种方法是使用集合来表示日期范围,其中每个集合代表一天并由整数标识。然后,一组成员将代表当天可预订的房间。由于预订每天在同一时间开始和结束,并且任何预订都可以在一整天内进行衡量,因此您可以将任何一天表示为整数。例如,使用Unix纪元(1970年1月1日)作为开始时间,今天(2016年4月24日)将是16915.或者在JavaScript中:

Math.floor(new Date().getTime() / (1000 * 60 * 60 * 24));

然后,您可以通过在输入范围内的天数内设置交叉点来查找给定日期范围内的哪些房间。 This gives you O(n * m) lookup time其中n是最小集合的大小,m是集合的数量。由于该集合最多包含每个房间一次,这意味着n以房间总数为界。例如:

var _ = require("lodash");

var dateToInt = function(date){
  return Math.floor(date.getTime() / (1000 * 60 * 60 * 24));
};

var roomsInRange = function(client, start, end, callback){
  client.sinter(_.range(dateToInt(start), dateToInt(end)), callback);
};

当用户为日期范围预留房间时,您将从日期范围内的每个集合中删除该房间号。

var _ = require("lodash");

var dateToInt = function(date){
  return Math.floor(date.getTime() / (1000 * 60 * 60 * 24));
};

var reserveRoom = function(client, start, end, room, callback){
  var trx = client.multi();
  _.each(_.range(dateToInt(start), dateToInt(end), function(day){
    trx.srem(day, room);
  });
  trx.exec(callback);
};

这种方法复制了大量数据,因为每个房间都有多次表示,但大小受房间数量和需要表示的最大日期范围的限制。例如,我不认为用户可以提前5年预订,也不允许过去预订,这意味着除了限制输入的上限外,您还可以清理过去的条目。范围。鉴于密钥是整数,房间很可能也用整数表示,如果一年的预算超过1或2 MB,我会感到惊讶。