文/宁方美 贺雪梅 牟晋娟
时间管理、安全管理、消费管理在近些年的企业管理中越来越受到管理者的关注。在国外,由于人工成本高昂,时间管理更是企业生存发展的重要环节。企业一卡通就是帮助客户实现时间管理、运营安全等方面的统一管理,让时间管理变得更简单、安排的更合理、发挥出更大价值。企业一卡通系统是软件硬件相结合的系统,终端设备多样化,对于一个中大型的企业来说,每日产生的数据量是非常庞大的,企业一卡通开发的难点之一是保证终端和服务器端的数据的一致性,避免数据在上传下达过程中丢失。
本文结合实际企业一卡通项目开发经验,围绕SpringBoot技术架构中如何采用Redis缓存技术设置特定的操作流程,解决系统中数据同步问题。
SpringBoot是在 2013年推出的新项目,主要用来简化 Spring 开发框架的开发、配置、调试、部署工作,同时在项目内集成了大量易于使用且实用的基础框架。
在传统的Spring框架中开发,用户需要自行编写XML文件,并在Maven、Gradle中加入相应的依赖包,在响应的代码中添加功能代码,才能使用;如果使用SpringBoot开发,仅需在Maven、Gradle配置文件中加上少量的配置,即可在代码中使用所需的框架,让原本的配置简化到几乎是零代码、零 XML 配置,同时依赖包的版本问题也由SpringBoot轻松解决,所以SpringBoot非常适合大型项目的开发配置。
Redis是一个key-value存储系统,也是NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,Redis优势主要包括:
(1)性能极高,Redis是一种NoSql数据库,Redis的操作是在内存中进行的,其速度相比于MySQL之类的数据库,相当于内存读写与硬盘读写的差别,Redis能读的速度是110000次/s,写的速度是81000次/s ;
(2)支持的数据类型丰富,Redis支持二进制案例的 Strings,Lists,Hashes,Sets 及 Ordered Sets 数据类型操作;
(3)支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行;
(4)丰富的特性,Redis还支持 publish/subscribe,通知,key 过期等等特性。
基于上述优势,Redis技术最大的应用场景就是用来做缓存。缓存技术可以大大减轻服务器的压力,减少数据丢失,提高系统中数据的一致性和完整性。
在企业一卡通系统中,员工每天通过终端进行考勤打卡、餐厅的消费记录等操作,这些终端产生的数据必须最终同步到服务器端,我们称之为“上传数据”。
另一方面,系统管理员在服务器端添加或者修改数据,如新员工到人事报道,人事工作人员通过服务器端的管理窗口录入新员工的信息;人事在服务器端调整员工所在部门等;这些在服务器端的修改必须同步到对应的终端设备中,我们称之为“下发数据”。
在企业一卡通系统中,做好终端设备和服务器之间的上传下发,也就做好了数据的同步。实际的应用中,主要存在两个主要的问题:
(1)大量数据上传容易产生服务器拥堵;
(2)数据丢失严重。
本系统采用Redis缓存技术结合SpringBoot框架设置了一套企业一卡通的同步机制。
图1:HTTP PUSH协议流程图
HTTP 协议是一种请求/响应型的协议,而Push 协议是基于HTTP的基础上定义的数据协议,Push协议建立在TCP/IP 连接上,使用 Push 协议的客户端和服务器,必须由客户端先发起“初始化信息交互”请求成功之后,才能使用其他功能,比如上传数据、获取服务器命令、上传更新信息、回复服务器命令等,其中这些功能并没有先后顺序,取决于客户端应用程序的开发。如图1所示。
以“考勤打卡”为例说明“上传数据”实现机制。
(1)用户在终端打卡后考勤机自动发送RestApI POST请求到Server,客户端请求示例如下:
POST /iclock/cdata?SN=0316144680030&t able=ATTLOG&Stamp=9999 HTTP/1.1
Host: 58.250.50.81:8011
Content-Length: 145
1452 2015-07 -30 15:16:28 0 1 0 0 0
1452 2015-07 -30 15:16:29 0 1 0 0 0
8965 2015-07 -30 15:16:36 0 1 0 0 0
8965 2015-07 -30 15:16:37 0 1 0 0 0
(2)Server端接收到请求后,将此条考勤数据写入到Redis Queue中,同时给终端响应,Redis Queue中存储着所有终端上传的更新数据。
服务器响应: HTTP/1.1 200 OK Server: nginx/1.6.0
(3)在Redis Queue中可以设置不同的参数,选择实时写入或者定时写入数据库的方式,Redis Queue会按照先进先出的规则逐条取出更新数据写入的数据库。
以“新增人员”说明“下发数据”的实现机制。
(1)人事通过管理页面录入新员工的基本信息,该条数据立即写入数据库中。
(2)按照设备协议规则组织添加数据命令,并把命令写入到Redis Cache中,新增人员的命令格式如下:
C:${CmdID}:DATA${SP}UPDATE${SP}USERINFO${SP}PIN=${XXX}${HT}Name=${XXX}${HT}Passwd =${XXX}${HT}Card=${XXX}${HT}Grp=${XXX}${HT}TZ=${XXX}${HT}Pri=${XXX}
部分字段说明:
1.PIN=${XXX}:用户工号
2.Name=${XXX}:用户姓名,当设备为中文时,使用的是 GB2312 编码,其他语言时,使用 U TF-8 编码
3.Passwd=${XXX}:密码
4.Card=${XXX}:卡号,值支持两种格式
(3)终端设备可以设置心跳包,规则间隔执行命令的时间,自动执行服务器端的Redis命令;一旦指令已经执行过且执行成功,该条指令将从Redis Cache中删除;执行失败的指令将被标注重新存储。
在3.2 和3.3中分别讲述在作者参与的企业一卡通系统中,如何同步终端和服务器端的数据。Redis在“上传数据”和“下发数据”中分别采用了不同的技术手段,从终端上传的各种数据首先保存的Server端的Redis Queue中,按照先进先出的原则在从Redis Queue将数据写入数据库;服务端更新的数据写入数据库后,全部保存到Redis Cache中,根据设置的更新周期和频率逐步从Cache中获取更新指令,指令执行成功后实时更新Cache,从实际的系统运行效果来看,该机制大大降低了服务器拥堵问题,充分证明了Redis技术在解决此类问题中的强大功能。从实际应用效果看,终端和服务器端数据的一致性可以达到98%以上。