当用户请求某个链接生成数据,单次生成1k,两个用户同时请求时,数据库会产生重复数据,怎么避免这个问题?

sFrank
  • 26

用户访问某个链接,后台收到请求之后获取最后一个ID(比如 23) 并+1(得24),我拿这个数字通过接口获取相关链接 比如 ex.cn/24 之后再将 这个链接存入数据库,这个时候 这条数据 id是 24 链接编号也是24 链接是 ex.cn/24 。
接口限制每次只能生成一个而我需要大量的链接,这时我会获取最后一个ID并循环+1访问接口并把链接放入数组中。并一次性存入数据库。
问题是 这一套流程走下来 需要三分钟。这三分钟内 如果有人再次发起请求,生成的链接的编号就会重复。求大神指点 我该怎么处理?

回复
阅读 194
4 个回答
  1. 数据库自增字段
  2. 使用统一id的分发服务

如果可以不需要立马返回消息,你可以把请求塞到一个队列里面,一个一个处理数据避免冲突,当然也可以使用自增id,或者用一个id生成器

做一个生成链接的任务表

任务id完成状态创建时间完成时间
102021-04-15 20:00:002021-04-15 20:00:00
202021-04-15 20:03:002021-04-15 20:03:00

写一个脚本每分钟获取一次这个任务表中未完成的任务

再在任务中执行你现有的逻辑,取出数据中最后一个id+1啥的

最后更新一下当前任务的状态和完成时间

Jutexiansen
  • 2
新手上路,请多包涵

取最大值的方法改为从redis取,
每次取值加上分布式锁,
计算完本次请求要生成的ID再把计算完的ID放入redis,
释放redis锁,
redis为空再从数据库取出放入redis
步骤:
1.lock()
2.getMaxId()
3.setMaxId()
4.unlock()

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

宣传栏