张云飞
(天才在线(北京)科技有限公司,北京市 100094)
在互联网高速发展的今天,网购和抢票在我们生活中越来越常见,尤其是近年来网络直播带货如雨后春笋,遍布我们的周围。各个平台都会对应出很多优惠秒杀的活动来吸引消费者,在流量大量负载的情况下,轻松应对秒杀等环节就显得尤为重要。通过运用Redis 实现秒杀的场景,能够轻松应对极高负载下的数据请求,以保证数据准确的同时,减轻服务器压力,提升系统的工作效率。
REmote DIctionary Server(Redis)是一个由 Salvatore Sanfilippo 写的 keyvalue 存储系统。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 是一个速度非常快的非关系数据库(non-relational database),它可以储存键(key)与5 种不同类型的值(value)之间的映射(mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能。
性能极高;丰富的数据类型-Redis 支持二进制案例的 Strings,Lists,Hashes,Sets 及 Ordered Sets 数据类型操作;原子–Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC 指令包起来;丰富的特性–Redis 还支持 publish/subscribe,通知,key 过期等等特性。
C#是可用于创建要运行在>NETCLR 上的应用程序的语言之一,它从C和C++语言演化而来,是Microsoft 专门为使用.Net 平台而创建的。是一个现代的,通用的,面向对象的编程语言。
现代的,通用的编程语言,面对对象,面向组件,容易学习,可以在多种计算机平台上编译,.Net 框架的一部分;快速地构建一个应用,设计美观的用户界面,构建令人赞叹的可视化程序,专注于解决你的实际问题。
SQLServer 是由美国Microsoft 公司研发出来的一种可扩展,高性能的关系型数据库管理系统(RDBMS)。主要功能就是同各种数据库建立联系。
用户界面图形化,管理数据更加明朗清楚;工具非常丰富,可选择性强;集成WindowsNT,高性能设计;伸缩性很好,可跨越多平台使用;有强大的事务处理功能,确保数据的完整性。
本系统一共分为商品模块,秒杀模块,消费模块三个模块。由商家 进行商品的上架和设置秒杀个数,开始时间等设置,消费者在秒杀开始后,进行秒杀,秒杀成功的消费者进行支付,商品去库存,秒杀失败的消费者给予失败提示。
第一,数据写在内存当中,而不是硬盘当中。在大数据并发的情况下,传统模式中,如果频繁请求数据库实时获取库存,写入数据等操作会给服务器带来很大的压力,导致服务器宕机。通过Redis 将数据写入内存,内存的读写速度比SSD 硬盘快不止10倍,比普通硬盘快百倍。因此,将数据先写入内存,就能使系统运算能力提升上千倍。设计思路如图:
第二,进行异步操作,而不是同步操作。同步操作在面对大并发时,需要准备大量的服务器来应对,但是秒杀场景属于短时大并发,有很明显的波峰和波谷,应对短时大并发购买大量服务器在经济上不合算。另一个,一条完整的程序请求链有时可能需要很长时间,让用户一直等待,体验很差,异步操作可以在后台持续运行,用户请求后直接返回。处理能力会有很大的提升。
第三,分布式处理。可以安排多台服务器参与,把海量用户的请求分散到各个服务器上,减少单个服务器压力。
此模块分为商家界面和用户界面两种。主要是实现商品的发布,上架,设置秒杀时间和秒杀数量,展示在用户界面。
第一,商家界面。1.商品发布:该功能主要是商家进行商品的发布上架,设置商品信息,图片等介绍,设置是否开启秒杀,秒杀时间,秒杀数量等信息,保存后储存到SqlServer 数据库中。2.商品管理:该功能是将商家发布的商品进行展示,商家可以管理自己发布的商品,进行下架,删除,修改,发物流等操作。3.查询功能:商家可以输入需要查找的商品关键字,模糊搜索查找到对应的商品。还可以查看各个商品下那些人购买过等详情。
第二,用户界面。1.用户登录:用户输入用户名,密码登录系统,系统会检查用户名,密码是否存在,是否合法。2.商品查看:该功能主要是展示商家发布出来的商品列表,用户可以点击商品查看各个商品的详细信息。3.查询功能:用户可以查询自己购买的商品的详情,可以进行退货退款或者确认收货等操作,还可以看到物流等信息。
对于秒杀的商品,页面会有秒杀开始倒计时,秒杀开始后,用户在商品详情页面进行秒杀操作,提交用户信息和商品信息到后台,通过程序进行秒杀实际操作。系统先根据商品id 获取到商品可以秒杀的总数量,写入到Redis 缓存当中,一个秒杀请求进来,加锁,先判断根据设置的Redis的Key,看是否能找到这个缓存的Value,如果找不到,则根据商品id 获取已经秒杀成功的数量+1 放入redis 缓存中,判断当前Key的Value和秒杀总数相比,如果当前数量<=秒杀总数,则放到异步中进行数据交互,否则直接返回false 提示秒杀已没库存。异步采用的是RabbitMq 消息队列,特点是先进先出,一次只能执行一条数据,不会造成数据拥挤,完美的解决了并发。主要代码如图:
该模块就是针对已秒杀成功的用户,进行支付的操作,调用唤起微信支付等操作进行支付功能,不做过多描述。支付成功后,系统拿到成功返回值,提示用户支付成功,商品变成待收货状态,可以在待收货中查看并可以进行退货等操作。提示商家该物品已完成支付,可以进行发货等操作。
数据的存储至关重要,数据库表设计的好坏直接影响系统运行的速度。本系统用的是SqlServer 数据库。1.商品主表:表字段主要有主键id(自增),商品名称,商品内容,发布用户ID,是否秒杀,数量,创建时间,商品状态。2.用户主表:表字段主要有主键ID(自增),用户名,密码,用户类型,创建时间,用户状态。3.用户购买商品记录表:表字段主要有主键ID(自增),商品ID,用户ID,创建时间,状态。4.物流表:表字段主要有主键ID(自增),用户购买记录表ID,商品ID,用户ID,物流信息,状态,创建时间。
互联网高速发展的今天,各种电商,自媒体等平台势头越来越盛,大家随时随地都在享受网购带给人们的便利,各种秒杀活动也越来越多,大数据高并发成了平台不得不面对的山峰。本设计利用Redis 将数据写入内存,大大提升了读写速度,数据请求中80%都是读的请求,利用Redis 读写分离,把读数据的速度提升上千倍,自然运行速度提升,服务器压力减小,使得同量级的服务器能承载更大数据量访问,也使得服务器相对稳定。在实际应用中是非常推荐的。