站长博客
站长博客随手笔记
Toggle navigation
站长博客
Home
MacOS
Database
Linux
PHP
Git
Golang
About Me
Archives
Tags
并发锁解决方案
2019-08-30 11:10:41
289
0
0
admin
【业务场景】:10 万用户在同 1 秒种进行抢红包的操作,红包只有 10 个 【回答1】: 对于这种大并发抽奖, 注意 3 点 1. redis incr 使用原子计数可以解决, 并发情况下不会超发 2. 用户锁, 解决同一用户同时多次秒杀, 除非你不在乎一个用户中了多次奖品 3. 防人机, 简单的方案是图形码 或者是 CSRF 都可以 注意一下流控, 不要让大流量冲垮你的系统, 宁愿让用户看到系统忙, 也不要让用户看到 500 【回答2】: 因为 Redis 支持原子操作,所以可以使用 Redis 做。 1. 比如 redis incr ,因为是原子操作,你不需要担心并发的问题,你只需要判断每次 incr 后的值是否小于等于 10. 2. 使用有限资源的模式,比如使用 redis list ,先创建好 10 个资源,然后每次操作都是 pop ,因为只有 10 个资源,不会 pop 出来 11 个资源的,谁拿到资源谁就中奖。 另外,一般的配置, Redis 并发几万的请求一点问题也没有。 【回答3】: 1. 用 Redis 的 queue ,开奖前 enqueue 10 个元素进去,开奖后 dequeue ; 2. 用 Redis 的 setNx ,预定义 10 个 key ,能 setNx 成功表示得奖了 【参考文档】: redis incr: http://redisdoc.com/string/incr.html redis setnx:http://redisdoc.com/string/setnx.html 【相关实现】: PHP:https://github.com/zhaocong6/lock GO:https://github.com/go-redsync/redsync https://github.com/go-locks/distlock
Prev:
Mac交叉编译linux go-sqlite3错误
Next:
Docker容器的创建、启动、和停止
0
likes
289
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Table of content