我们正在开发售票电子商务系统。我们经常在销售期间遇到大量的请求。
我们使用couchdb进行缓存,将SQL Server数据库用作数据存储。
我们正在处理的一个场景是,如果事件的所有门票都已售出,我们会希望阻止任何用户购买它们。
为了能够做到这一点,我们必须在每次销售中查询数据库,这将是非常糟糕的。
我的想法是最初查询事件的门票数量并将其存储在couchdb中,每次销售时我们都会减少couchdb记录的可用门票。当couchdb记录达到零时,我们更新数据库并阻止任何用户购买该事件的任何票据。
您能否验证我的想法,或者如果您有更好的解决方案,请详细说明。
谢谢
答案 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这样的东西会是一个更好的选择。