Redis 建模保留
Redis modeling reservations
我正在做一个个人项目来学习 Redis。我正在尝试将其用作管理酒店的数据库。我正在思考如何管理预订。
问题是,有多个房间,每个房间可以有多个预订,存储date-from和date-to。我只是不确定如何对此建模,以便能够在给定的给定时间段内有效地找到空房间。
目前,我一直在考虑将每个单独房间的预订存储在分类集中,但这样我就必须一个一个地遍历房间,直到找到合适的房间。
欢迎任何意见。谢谢
一种方法是使用集合来表示日期范围,其中每个集合代表一天并由一个整数标识。然后一组成员将代表当天哪些房间可供预订。由于预订每天在同一时间开始和结束,并且任何预订都可以用整日来衡量,因此您可以将任何一天表示为整数。例如,使用 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,我会感到惊讶。
我正在做一个个人项目来学习 Redis。我正在尝试将其用作管理酒店的数据库。我正在思考如何管理预订。
问题是,有多个房间,每个房间可以有多个预订,存储date-from和date-to。我只是不确定如何对此建模,以便能够在给定的给定时间段内有效地找到空房间。
目前,我一直在考虑将每个单独房间的预订存储在分类集中,但这样我就必须一个一个地遍历房间,直到找到合适的房间。
欢迎任何意见。谢谢
一种方法是使用集合来表示日期范围,其中每个集合代表一天并由一个整数标识。然后一组成员将代表当天哪些房间可供预订。由于预订每天在同一时间开始和结束,并且任何预订都可以用整日来衡量,因此您可以将任何一天表示为整数。例如,使用 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,我会感到惊讶。