关于简单数据频繁读写的数据库选择?

MR00009 2015-11-26 09:51:27
像最近很流行的一元夺宝类网站,比如一件商品5000元,则该商品有10000001-10005000共5000个8位号码。
用户购买1000元,则在该范围内随机生成1000个不重复号码。


我的设计逻辑是,创建一张号码池表,三个字段:商品ID、号码、状态(0=表示可取,1=表示已被取走)
用户购买后,随机从号码池取出号码,并将这些号码的状态改成1。

不知道是否有更好的方式取号?

像这种使用MSSQL够用吗?是否会有瓶颈?
使用MongoDB等是否可行,数据准确性和稳定性能不能和MSSQL一样。
...全文
864 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 7 楼 xdashewan 的回复:
[quote=引用 6 楼 xgp0009 的回复:] 那有没有什么锁,可以在并发时,尽量避免不同用户取到同一个号码?
如果你按事先打乱来取码,那么你可以这么做,首先你码表需要一列顺序数字的id,如果是主键那最好,然后你建一张单独的取值表,里面只有1行1列,保存下一个能取的码表的id(注意是id而不是码)。这样用户取得时候只需要锁住这张表,取id,并把id+1就完成了取id,后续的去码表取码操作什么的都可以不用锁表。这样做好处是最小规模的锁表,而且表十分简单,读写操作均极快,避免锁住数据量巨大的码表。[/quote] 学到了,3Q
  • 打赏
  • 举报
回复
数据量在100w,应该没什么问题,而且你是每次只是对少量数据进行update。
xdashewan 2015-11-26
  • 打赏
  • 举报
回复
引用 6 楼 xgp0009 的回复:
那有没有什么锁,可以在并发时,尽量避免不同用户取到同一个号码?
如果你按事先打乱来取码,那么你可以这么做,首先你码表需要一列顺序数字的id,如果是主键那最好,然后你建一张单独的取值表,里面只有1行1列,保存下一个能取的码表的id(注意是id而不是码)。这样用户取得时候只需要锁住这张表,取id,并把id+1就完成了取id,后续的去码表取码操作什么的都可以不用锁表。这样做好处是最小规模的锁表,而且表十分简单,读写操作均极快,避免锁住数据量巨大的码表。
MR00009 2015-11-26
  • 打赏
  • 举报
回复
引用 5 楼 xdashewan 的回复:
对于数据量大我是那么看的,1.如果活动可以区分,比如说第一期第二期,那么你可以对应创建子码池,比如一期是10W条,那么每期你要操作的数量就只有10W。2.可以尝试在码池生成时候就进行打乱,如果一定要保留原码表的次序,你也可以新建一个打乱后的码表,这样你可以在取码的时候不必乱序取码,而是根据主键索引依次取,因为码本身就是打乱的。 1和2可以结合使用即一期10W条打乱次序的码
十分感谢!确实要在生成每个商品号码时打乱一下。 UPDATE只执行一次,是有加上商品ID和状态进行修改,如 WHERE ProductId=@ProductId AND State=0 AND Number IN。。。 关于每一期,我的想法是,一期结束后,将该商品号码一次性修改 State=0,因为有另一张表在存储用户购买的号码。 号码池打算作为快速取号且避免重复使用。 那有没有什么锁,可以在并发时,尽量避免不同用户取到同一个号码?
xdashewan 2015-11-26
  • 打赏
  • 举报
回复
对于数据量大我是那么看的,1.如果活动可以区分,比如说第一期第二期,那么你可以对应创建子码池,比如一期是10W条,那么每期你要操作的数量就只有10W。2.可以尝试在码池生成时候就进行打乱,如果一定要保留原码表的次序,你也可以新建一个打乱后的码表,这样你可以在取码的时候不必乱序取码,而是根据主键索引依次取,因为码本身就是打乱的。 1和2可以结合使用即一期10W条打乱次序的码
xdashewan 2015-11-26
  • 打赏
  • 举报
回复
UPDATE NmberPool SET Satet=1 WHERE Number IN (SELECT Number FROM temp)你这条语句需要重复运行吗?其实运行过后很多NmberPool的Satet已经为1,再次运行的时候因考虑排除这部分数据的重复更新,比如UPDATE加上Satet等于0或不等于1的条件,也可以在temp表里做排除
MR00009 2015-11-26
  • 打赏
  • 举报
回复
这样的业务MSSQL够用吗?号码池数据量比较大,应该在一百万左右。 有点担心IO占用率。
MR00009 2015-11-26
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
设计本身没有问题,但你的描述中我只看到频发写,并没有看到读
嗯,应该是频繁写。 我的步骤是:1、定义临时表temp;2、从号码池随机取出号码加入临时表temp;3、修改号码池的号码状态(UPDATE NmberPool SET Satet=1 WHERE Number IN (SELECT Number FROM temp)) 之后就是对临时表的操作。
xdashewan 2015-11-26
  • 打赏
  • 举报
回复
设计本身没有问题,但你的描述中我只看到频发写,并没有看到读

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧