張云飛
(天才在線(北京)科技有限公司,北京市 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 讀寫分離,把讀數據的速度提升上千倍,自然運行速度提升,服務器壓力減小,使得同量級的服務器能承載更大數據量訪問,也使得服務器相對穩定。在實際應用中是非常推薦的。