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

在高流量期间使用couchdb进行缓存和可伸缩性,couchdb,Couchdb,我们正在开发一个售票电子商务系统。在销售期间,我们经常会遇到大量的请求 我们使用couchdb进行缓存,使用SQL server数据库作为数据存储 我们正在处理的一个场景是,如果某个活动的所有门票都已售出,我们希望阻止任何用户购买门票 要做到这一点,我们必须查询每笔销售的数据库,这将非常糟糕 我的想法是先查询一个活动的门票数量,然后将其存储在couchdb中,每次销售时,我们都会减少couchdb记录中可用的门票数量。当couchdb记录为零时,我们更新数据库,并阻止任何用户购买该事件的门票 你

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

我们使用couchdb进行缓存,使用SQL server数据库作为数据存储

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

要做到这一点,我们必须查询每笔销售的数据库,这将非常糟糕

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

你能证实我的想法吗?或者如果你有更好的解决方案,请详细说明


谢谢你

你的方法没有错。你可以按照你在问题中描述的方式来做,这将是非常好的。我个人更喜欢另一种方法。考虑一个事件:

{
  "_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

}
然后我们创建一个视图,如:

地图 减少 然后使用
key=“event\u id\u for\u which\u want\u tickets\u selled”&reduce=true查询此视图,以获取已售出的门票数量

为什么这样?

因为它允许您存储有关已售出门票的更多信息,而不仅仅是在
计数器-1
上。稍后,您可以对实际售出的门票进行某种分析,这可能会帮助您更好地理解您的应用程序

关于缓存


虽然couchdb在缓存方面无疑是一个不错的选择,但对于这个特定的用例,我认为redis之类的东西会是一个更好的选择。

为什么你认为couchdb在从整数中减去1并持久存储时会比,mssql?@IfLoop我只是问它是不是,什么是处理这种情况的最佳方法,如果你有其他方法,请随意评论,认为更适合这种情况的方法是Redis或Aerospike,两者都可以选择在给定某个键的情况下增加值。事件源/日志是一个不错的概念。我不知道“true”计数在这个域中有多重要,但请记住CouchDB二级索引最终将保持一致。同意转而研究Aerospike或Redis之类的产品。
function(doc){
if(doc.event_id){
emit(doc.event_id,null);
  }
}
_count