高效的优惠券(发送和使用)技术选型和方案

新手上路,请多包涵

问题描述

最近要做高速率的发放优惠券系统,现在数据库用的mysql,有分库分表,但对发送速率有瓶颈,而且对于批量操作比较复杂(按照用户ID取模做的分库分表,对批量用户,也就是无规则的userId的处理比较麻烦)。想用redis或mongodb来做db,然后worker同步到mysql(mysql只做最后保障和数据分析用,业务中不使用)。对于mogno不太熟悉,请问有什么好的解决方案?

问题出现的环境背景及自己尝试过哪些方法

考虑过直接使用redis,使用List结构,存储每个用户的优惠券列表,key为XXX_{userId}。有些不好解决的问题,例如使用优惠券时的更新操作,还有定期删除一段时间的过期数据,等等。

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

你期待的结果是什么?实际看到的错误信息又是什么?

请问有没有成熟的设计方案,可以处理大量的高速的发券(插入)操作,并且对于用户查看/使用优惠券等场景的并发处理和响应速率有高性能的支持。

阅读 3.3k
1 个回答

看了一遍下来我觉得你要解决的似乎就2个问题:

  1. 较高的插入性能
  2. 方便地更新和删除

从MongoDB的角度来讲满足这2点没有什么问题。

  1. MongoDB的分片机制可以让数据在逻辑上是一个整体,在物理上分散到不同的服务器。比起分库分表是一个更简单易用的解决方案。
  2. 性能上给个简单参考:在我的Macbook Pro (SSD磁盘)上一个没有任何优化的实例插入小文档(100字节左右),应用BULK操作大约能有10w+/s的插入速度。如果有必要还可以通过分片加服务器来扩展。
  3. 不清楚你要进行什么样的更新,但是通常情况下MongoDB可以根据指定的条件更新指定的文档,并且可以命中二级索引,大部分场景下是适用的。至于删除数据,MongoDB有TTL Index可以自动根据时间删除过期的数据。

不知道有没有解答到你的疑问。如果有更详细的需求可以再描述一下。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题