京麦微信小程序圣诞抽奖项目的架构设计
来源: 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,再进行解密操作取得用户手机号,传入业务层。
在管理员流程部分,目前只支持批量导入,并且使用事务处理写入数据库的过程,要么全部成功,要么全部失败。
初始版本存在的问题
在初始版本设计中,用户每进行一次抽奖活动,后端就需要对数据库进行读写操作,存在严重的并发问题:
- 每进行一次抽奖活动,都要从数据库中查询数据,效率低下
- 存在并发问题:从数据库中产生的未中奖用户列表无法与数据库数据保持一致,有可能导致一个用户中奖多次
- 更新数据库操作要进行加锁处理,降低效率
优化思路
针对以上问题,我们在第二版中,针对抽奖算法做出了调整,摒弃了直接从数据库查询、更新数据的想法,改用Redis进行数据缓存,利用Redis中的List结构存储未中奖用户,用户进行抽奖活动时,从list中pop出中奖用户返回给前端,从而很好地解决了并发问题。而且整个流程只有在给前端返回中奖用户信息时才会对数据库进行读操作,不需要加锁,不会产生脏读问题,保证了数据安全。
主要优化思路如下:
- 管理员端只导入基本数据,取消user_in和user_out字段
- 将用户手机号初始化两份到JimDB中,在初始化时进行无序存储
- List:存放未中奖用户手机号
- Hash:存放用户手机号<当前用户手机号,中奖用户手机号>
- 从List中lpop出手机号作为中奖用户,更新Hash中当前用户value为中奖用户手机号
- 返回中奖用户信息,在管理员端可以进行结果查询
初始化流程
初始化流程如图所示:
抽奖流程
抽奖流程如图所示:
不足之处
在正式上线使用后,也暴露出很多不足之处,目前该项目还未实现的功能模块如下:
- 查看结果模块的完全实现(目前只能查看Hash中的数据,没用过滤分析功能和对数据的二次加工处理)
- 单独修改用户信息(目前只支持批量上传,无法修改)
- 锁定未抽奖用户进行提示(目前没有这个功能的实现
相关阅读:《京东11.11:京麦服务市场交易平台备战实践》
1月13日,SDCC 2017之数据库线上峰会即将强势来袭,秉承干货实料(案例)的内容原则,邀请了来自阿里巴巴、腾讯、微博、网易等多家企业的数据库专家及高校研究学者,围绕Oracle、MySQL、PostgreSQL、Redis等热点数据库技术展开,从核心技术的深挖到高可用实践的剖析,打造精华压缩式分享,举一反三,思辨互搏,报名及更多详情可点击此处查看。
京麦微信小程序圣诞抽奖项目的架构设计相关推荐
- 京麦微信小程序圣诞抽奖项目总结
肖依云,2017年加入京东,目前就职于京东商城京麦平台组,从事京东商家开放平台的相关开发工作. 该项目的主要功能特点是类似于一个秒杀系统,存在短时间高并发问题,在拿到项目需求后,我们对该项目进行了两版 ...
- IVX低代码平台开发——微信小程序实现抽奖功能
写在前面 通过利用可视化编程实现微信小程序的抽奖功能,带大家初步了解 iVX 的强大之处. 文章目录 写在前面 iVX开发 抽奖功能实现 iVX开发 基本介绍 iVX是一个 "零代码&quo ...
- 微信小程序——翻牌抽奖功能
目录 前言 一.效果展示 二.主要代码 1.wxml主要代码: 2.wxss主要代码 3.js主要代码 4.app.js主要代码 三.实现思路及注意点 1.洗牌功能实现方法 2.翻牌功能实现方式 3. ...
- 详解微信小程序开发(项目从零开始)
关注公众号 风色年代(itfantasycc) 280G前端&小程序资料随便拿! 详解微信小程序开发(项目从零开始) 一.序 微信小程序,估计大家都不陌生,现在应用场景特别多.今天就系统的介绍 ...
- 微信读书登陆界面java_(JAVA后端)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好...
转载地址:(JAVA后端)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好 转载请注明出处 一.环境搭建 相关环境软件:JDK1 ...
- 微信小程序云开发项目-个人待办事项-02今日模块开发
上一篇: 微信小程序云开发项目-个人待办事项-01介绍 https://blog.csdn.net/IndexMan/article/details/124485626 模块开发步骤 本篇介绍今日模块 ...
- 微信小程序云音乐项目
微信小程序云音乐项目 微信小程序云音乐项目 1. 项目介绍 技术栈 项目使用库 项目目标 2. 页面效果和功能展示 3. 项目源码与 API 接口 4. 项目说明 5. 致谢 微信小程序云音乐项目 1 ...
- 微信小程序电商项目开发实战漫谈
原创文章,若转载请于明显处标明出处和相关链接:https://www.toutiao.com/i6567868839856439822/,否则追究其法律责任! 2018年小程序内容电商风口已成,如果我 ...
- 微信小程序电商项目商品详情页开发实战之数据绑定与事件应用
各位CSDN的朋友,我们都知道,现在微信小程序电商平台特别火爆,所以我将以一个生鲜电商项目为例,为大家讲述微信小程序的实战化开发,价值几万元的成熟项目,你可千万不要错过哦. 大家直接通过视频链接直接看 ...
最新文章
- Android数据手册02:android.permission权限请求汇总
- 心累了,就笑一笑,学会爱自己
- 模拟usb设备_高速USB数据采集卡
- 《数据结构》是计算机应用,《数据结构》期中测试-2014计算机应用技术用.doc
- 【实验】不会部署VRRP?看完就会了
- c++ 字符串合并_C语言输入字符和字符串(所有函数大汇总)
- Rapidmind计算库性能测试
- 在VS2010中使用Git【图文】
- 前端学习(2349):tabber的其他属性
- 3倍根号x加1分之一c语言,用C语言将一个数开根号后再取倒数的方法
- 64位windows系统如何显示32位dcom组件配置
- linux-2.6.22.6 内核源代码包的文件目录介绍
- ios App内评价问题
- 使用ConcurrentDictionary实现轻量缓存
- 北京市丰台区卫星地图下载
- 6款良心本地视频播放器,功能强大还完全免费
- 【知识兔Excel教程】7个Excel序号填充的经典案例,照搬这些公式,效率倍增
- 高德地图实现多天路线规划(途经点显示自定义内容)+轨迹回放(显示车牌)
- 借助 Finder 的Jitouch插件实现 Chrome 三指在 New Tab 中打开链接
- NLP数据预处理的一般方法