文/寧方美 賀雪梅 牟晉娟
時間管理、安全管理、消費管理在近些年的企業管理中越來越受到管理者的關注。在國外,由于人工成本高昂,時間管理更是企業生存發展的重要環節。企業一卡通就是幫助客戶實現時間管理、運營安全等方面的統一管理,讓時間管理變得更簡單、安排的更合理、發揮出更大價值。企業一卡通系統是軟件硬件相結合的系統,終端設備多樣化,對于一個中大型的企業來說,每日產生的數據量是非常龐大的,企業一卡通開發的難點之一是保證終端和服務器端的數據的一致性,避免數據在上傳下達過程中丟失。
本文結合實際企業一卡通項目開發經驗,圍繞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%以上。