在高流量时段使用couchdb进行缓存和可伸缩性

时间:2014-09-04 16:52:35

标签: couchdb

我们正在开发售票电子商务系统。我们经常在销售期间遇到大量的请求。

我们使用couchdb进行缓存,将SQL Server数据库用作数据存储。

我们正在处理的一个场景是,如果事件的所有门票都已售出,我们会希望阻止任何用户购买它们。

为了能够做到这一点,我们必须在每次销售中查询数据库,这将是非常糟糕的。

我的想法是最初查询事件的门票数量并将其存储在couchdb中,每次销售时我们都会减少couchdb记录的可用门票。当couchdb记录达到零时,我们更新数据库并阻止任何用户购买该事件的任何票据。

您能否验证我的想法,或者如果您有更好的解决方案,请详细说明。

谢谢

1 个答案:

答案 0 :(得分:0)

你的方法没有错。您可以按照您在问题中描述的方式进行操作,这样就可以了。我个人更喜欢不同的方法。考虑一个事件:

{
  "_id": 8e23456781b5567890,
  "event":"The rat pack symphony live from New york",
  "tickets" : 6000
}

每当购买新故障单时,我们都会添加新的故障单文档,而不是递减此故障单计数器。

{
  "_id": 7c665934r8206513,
   "sold_at":1409937545893,
   "event_id": "8e23456781b5567890",
    "sold_to":"some_one"
...other meta data

}

然后我们创建一个类似的视图:

地图

function(doc){
if(doc.event_id){
emit(doc.event_id,null);
  }
}

减少

_count

然后使用key="event_id_for_which_you_want_tickets_sold"&reduce=true查询此视图以获取已售票数。

为什么这样?

因为它允许您存储有关售出的票证的更多信息,而不是仅仅执行counter -1时。稍后您可以对实际销售的故障单进行某种分析,这可能有助于您更好地了解您的应用程序。

关于缓存

虽然在缓存方面,couchdb当然是一个不错的选择,但对于这个特殊用例,我认为像redis这样的东西会是一个更好的选择。