張丹 陽萬安


摘要: 在全球經濟化的大形勢下,酒店門戶網站趨于國際化,網站實現了多語言,多匯率,各個國家的稅率也存在差異,此時將緩存技術應用到酒店門戶網站的訂房系統中,可以極大的提高房型價格的查詢效率.
關鍵詞:緩存結束、Redis、酒店門戶網站、多語言
1引言
應用中使用緩存技術,往往可以大大減少計算量,有效提升響應速度,讓有限的資源服務更多的用戶。但是,似乎還沒有一種緩存方案可以滿足所有的業務場景,我們需要根據自身的特殊場景和背景,選擇最適合的緩存方案,盡量以最小的成本最快的效率達到最優的目的。本文根據酒店實際應用場景將從多個方面對緩存進行分析,以便選擇出最優的緩存方案。
2緩存的理解
2.1 緩存的優點
總結來說,緩存在如下三個方面做了提升:
性能——將相應數據存儲起來以避免數據的重復創建、處理和傳輸,可有效提高性能;穩定性——同一個應用中,緩存數據也能降低對數據庫的訪問次數,降低數據庫的負擔和提高數據庫的服務能力;
可用性——有時,提供數據信息的服務可能會意外停止,緩存技術可以在一定時間內仍正常提供對最終用戶的支持,提高了系統的可用性。
2.2 Redis簡介
Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件[1]。 它支持多種類型的數據結構,是一個高性能的 key-value 數據庫。
Redis 與其他 key - value 緩存產品有以下三個特點:
·Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
·Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
·Redis支持數據的備份,即master-slave模式的數據備份。
3 Redis與MemoeryCache實際應用
3.1應用場景
對于全球化的大型酒店,由于地域不同,不同酒店之間的價格存在差異,同時不同地域之間的人訪問同一酒店同一房型,同一房型按照配套存在不同的價格,如上圖所示,由于地域不一致則展示的價格應按照當地匯率轉換展示,這就需要進行大量地根據匯率計算不同的價格,如同一個位于北京的酒店,在某一時間段,世界各地的人通過訪問酒店官網預訂北京這家酒店的房間,那就需要進行幾十次按照匯率進行價格的計算,與此同時,還需要根據訪問網站的人是會員還是非會員展示不同的價格,以及原始價格等。如果大量的人訪問這一酒店就會產生大量的數據訪問及計算,而且中間還會涉及調用算稅相關api,如果進入酒店的查看價格頁面需要展示所有房型的價格,那頁面將需要很長時間去計算各個房型不同的價格,勢必導致頁面加載緩慢。
3.2解決策略
1.首先對于酒店價格這些數據,價格在一天時間內變化頻率不高,則不需要平凡更新緩存。
2.由于不同酒店在不同語言不同匯率下以及不同房型以及入住人數存在各種價格,非關系型數據庫Redis的存儲可以采用Key-value的方式存儲,則我們可以按照價格體系的需求,將數據組合成方便查詢的結構轉換成json存儲在redis中。
3.所以讀寫性能很好,可以達到10w/s的頻率,有效減少了頁面加載數據的時間。
同時采用MemeoryCache來緩存酒店的一些固定數據,如酒店code、折扣率等。
3.3具體實現思路
當一個用戶在世界某地訪問網站一個酒店查詢價格,則需要根據用戶選擇語言及匯率展示價格,首先網站會默認從Redis緩存查詢是否存在對應的價格,所存在則直接展示給用戶,若對應語言下價格不存在,則需要按以下流程處理價格。
首先,從價格平臺獲取改酒店所有房型及各個價格組合的原始價格。
其次,循環各個價格組合,將原始價格根據匯率計算出會員價格,非會員價格,這兩種價格中又包含總價、稅、稅前價,稅后價。將計算出的價格存入對應的實體模型列表中。
最后,根據當前用戶訪問的酒店id,語言,優惠碼,以及入住時間和人數組合成為key,上述步驟中的價格實體列表轉換為json,存入對應的價格數據庫。
那么如果其他用戶選擇同一語言下同一酒店訪問價格查詢頁面的時候,就會直接從Redis緩存中獲取計算后的價格,及時響應給頁面,極大的提高了網頁加載速度。
緩存過期策略方面,由于酒店價格變化并不是很頻繁,所以網站價格緩存采用一個小時自動清空價格組合下對應語言的緩存,那當用戶再次訪問時,又重新計算后存入對應key中。
結束語
利用Redis來緩存價格,極大的提高了價格展示頁面的加載速度,即使稅率Api不響應,我們也可以獲取緩存中的價格進行展示,所以通過這次實踐,意識到為了解決很多實際應用,需要多種技術的組合,才能找出最優解。
參考文獻:
[1]Josial L.Carison. Redis實戰.北京:人民郵電出版社,2015:10.
[2]ROBERT C. MARTIN.敏捷軟件開發[M].北京:機械工業出版社,2008:388.
[3] 李航 . 敏捷型軟件開發方法與極限編程概述 [J]. 計算機工程與設計, 2003 ,24(10):116-118.
宜賓學院人工智能與大數據學部 644000