高并发系统

高并发系统实例两则

大话程序猿眼里的高并发

高并发业务功能实例

签到功能,抽奖

需求: 签到功能,一天一个用户只能签到一次,签到成功后用户获取到一个积分。

数据库表: 用户表,包含积分字段

高并发问题: 在高并发的情况下,一个用户签到记录会有多条,或者用户签到后不止加一次积分。

设计:

首先根据需求我会添加一张签到记录表,这张表把用户唯一标识字段(ID,Token)和签到日期字段添加为唯一约束,这样就可以防止并发的时候插入重复用户的签到记录。然后再程序代码逻辑里,先执行签到数据的添加(这里可以防止并发,添加成功后再进行积分的添加,这样就可以防止重复的添加积分了。最后我还是建议所有的数据操作都写在一个sql事务里面, 这样在添加失败,或者编辑用户积分失败的时候可以回滚数据。

特点:

使用数据库事务,在前一个操作一定完成的情况下,在操作后面的逻辑。操作完成后解除数据库锁。

改进设计: 使用Redis 设置唯一锁。

Redis setNx: 如果设置的值不存在,就设置该值并返回true; 如果需要设置的值存在,则不会修改原值,并且返回false。

首先通过 setnx,以日期为键,用户ID 为值,获取唯一锁,然后往积分表里面插入数据。


大话程序猿眼里的高并发架构

高并发架构

架构

三级处理,三级缓存

APP 端缓存

CDN 静态资源缓存

服务端负载均衡

前端机缓存

缓存集群

数据库集群

消息队列处理异步消息

  1. 当用户参与活动(红包,抢购),将用户参与信息push到队列中
  2. 然后写个多线程pop数据,进行发放红包的业务
  3. 将活动结果推送给用户, 或者引导用户获取结果
  4. 这样可以支持高并发下的用户可以正常的参与活动,并且避免数据库服务器宕机的危险

发表评论