京麦微信小程序圣诞抽奖项目的架构设计

原创 2017年12月29日 11:17:51

来源: linkedkeeper.com
作者:肖依云,热爱技术,熟悉Struts2、Spring、Spring MVC等常用开源框架,对开发分布式、高并发系统有一定的学习和研究。正在学习大数据和AI相关技术,梦想是把代码写成诗。
责编:钱曙光(qianshg@csdn.net)

该项目的主要功能特点是类似于一个秒杀系统,存在短时间高并发问题,在拿到项目需求后,我们对该项目进行了两版程序设计,初始版本中,在高并发的情况下,无法保持数据的正确性,存在可能一个用户被抽中多次的问题,以及对数据库频繁的写操作会降低程序运行效率。

在第二版中,我们着重对两点问题进行了优化,摒弃了直接查询、更新数据库的思路,转用了Redis进行缓存处理,很好的解决了第一版中的两大痛点。

下面将对该项目程序设计的整体思路进行阐述。

项目需求

该项目是一个和微信小程序结合的抽奖活动,主要的业务需求如下:

1. 普通用户部分:

  • 手机扫二维码或者点击链接进入小程序
  • 点击“点我送礼”按钮,随机匹配送礼用户
  • 获得匹配结果,将礼物送给匹配用户

2. 管理员部分:

  • 上传用户数据
  • 进行数据初始化操作
  • 查看抽奖结果

初始数据库设计

根据项目需求,首先进行了初始版本的数据库设计,除了基本数据字段,我们在这里另外添加了两个标志字段user_in和user_out,分别代表该用户收到礼物对应ERP账号和送出礼物对应的ERP账号,用来记录当前用户收到了谁的礼物和将礼物送给了谁。

表结构如下图所示:

这里写图片描述

初始流程

在初始版本中,用户和管理员的主要程序流程如下图所示。

在用户流程中,从前端传进来的数据并不是用户手机号,而是jsCode,vi,和croptedData这三个参数,在Controller层接收以后调用微信小程序接口根据jsCode获取SessionKey,再进行解密操作取得用户手机号,传入业务层。

在管理员流程部分,目前只支持批量导入,并且使用事务处理写入数据库的过程,要么全部成功,要么全部失败。

这里写图片描述

初始版本存在的问题

在初始版本设计中,用户每进行一次抽奖活动,后端就需要对数据库进行读写操作,存在严重的并发问题:

  1. 每进行一次抽奖活动,都要从数据库中查询数据,效率低下
  2. 存在并发问题:从数据库中产生的未中奖用户列表无法与数据库数据保持一致,有可能导致一个用户中奖多次
  3. 更新数据库操作要进行加锁处理,降低效率

优化思路

针对以上问题,我们在第二版中,针对抽奖算法做出了调整,摒弃了直接从数据库查询、更新数据的想法,改用Redis进行数据缓存,利用Redis中的List结构存储未中奖用户,用户进行抽奖活动时,从list中pop出中奖用户返回给前端,从而很好地解决了并发问题。而且整个流程只有在给前端返回中奖用户信息时才会对数据库进行读操作,不需要加锁,不会产生脏读问题,保证了数据安全。

主要优化思路如下:

  1. 管理员端只导入基本数据,取消user_in和user_out字段
  2. 将用户手机号初始化两份到JimDB中,在初始化时进行无序存储
    • List:存放未中奖用户手机号
    • Hash:存放用户手机号<当前用户手机号,中奖用户手机号>
  3. 从List中lpop出手机号作为中奖用户,更新Hash中当前用户value为中奖用户手机号
  4. 返回中奖用户信息,在管理员端可以进行结果查询

初始化流程

初始化流程如图所示:

这里写图片描述

抽奖流程

抽奖流程如图所示:

这里写图片描述

不足之处

在正式上线使用后,也暴露出很多不足之处,目前该项目还未实现的功能模块如下:

  1. 查看结果模块的完全实现(目前只能查看Hash中的数据,没用过滤分析功能和对数据的二次加工处理)
  2. 单独修改用户信息(目前只支持批量上传,无法修改)
  3. 锁定未抽奖用户进行提示(目前没有这个功能的实现

相关阅读:《京东11.11:京麦服务市场交易平台备战实践》


1月13日,SDCC 2017之数据库线上峰会即将强势来袭,秉承干货实料(案例)的内容原则,邀请了来自阿里巴巴腾讯微博网易等多家企业的数据库专家及高校研究学者,围绕Oracle、MySQL、PostgreSQL、Redis等热点数据库技术展开,从核心技术的深挖到高可用实践的剖析,打造精华压缩式分享,举一反三,思辨互搏,报名及更多详情可点击此处查看。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dev_csdn/article/details/78929544

数据库表设计——转盘抽奖功能

一、基本需求     1. 不同的活动有不同的奖项配置;     2. 奖项类型大概有红包,实物,再来一次,积分等等;     3. 在不同的活动中,每个用户每天有多少次的抽奖机会; ...
  • victor_xu0331
  • victor_xu0331
  • 2017-04-20 18:45:34
  • 1927

抽奖系统数据库设计

首先我们来说说比较常见的随机概率: 这就好像我们说的,我有一百个乒乓,其中一个是红色。然后把这些放到一个盒子里面,然后你在进行摸。当你摸完一次以后,在把你摸到的乒乓放回到盒子里面,在进行摸。这些,你...
  • liujn347
  • liujn347
  • 2016-04-10 13:00:07
  • 3363

微信(weixin)大转盘抽奖页面、数据库以及抽奖算法

  • 2016年08月15日 15:59
  • 1.7MB
  • 下载

抽奖系统的设计

抽奖模块设计思路管理员在后台设置奖品的中奖概率,未中奖概率 = 1-中奖概率之和。伪随机数生成函数用于生成0-1之间的随机数,参考了官方手册中mt_getrandmax示例。 http://php...
  • koastal
  • koastal
  • 2017-05-27 15:17:31
  • 535

微信小程序转盘抽奖

1.定义抽奖弹框    .wxml {{detail}}     2.转盘布局圆盘及中间按钮     布局相对来说比较简单,一个转盘...
  • du591310450
  • du591310450
  • 2017-05-15 10:13:28
  • 890

微信小程序源码大集004---小程序实现大转盘 仿天猫抽奖 跑马灯效果(有图有源码)

基本实现功能 1,小程序仿天猫超市抽奖大转盘 2,跑马灯效果 3,开始抽奖,抽奖完成后有弹窗...
  • qiushi_1990
  • qiushi_1990
  • 2016-12-07 17:51:39
  • 8701

用微信小程序开发的Canvas绘制可配置的转盘抽奖

使用https://github.com/givebest/GB-canvas-turntable代码移植过而来。 其它 微信小程序感觉是个半成品,代码移植过程比较繁琐麻烦。canvas ...
  • zuoliangzhu
  • zuoliangzhu
  • 2016-11-15 22:28:10
  • 1482

微信小程序_抽奖转盘源码

  • 2017年07月31日 14:45
  • 142KB
  • 下载

微信小程序实例-摇一摇抽奖

概述前面我们讲了如何开始微信小程序搭建和一些组件的介绍。微信小组件和微信小程序入门微信小程序目录为了更好的理解小程序和小程序开发,我们首先来看一下项目的目录。 首先看下根目录下的app.json的文...
  • xiangzhihong8
  • xiangzhihong8
  • 2016-12-26 17:53:48
  • 10705

微信小程序开发详解(三)---微信小程序工程目录结构

1:打开微信小程序开发工具,进入编辑模式,如下图1所示 图1 1:这个项目主要由pages/firstPage,pages/index,pages/logs,这几个文件夹组成,这几个文件夹...
  • aoaoxiexie
  • aoaoxiexie
  • 2016-12-15 15:02:59
  • 2773
收藏助手
不良信息举报
您举报文章:京麦微信小程序圣诞抽奖项目的架构设计
举报原因:
原因补充:

(最多只允许输入30个字)