秦溧 艾青



摘要:針對Web服務器不能對用戶訪問系統時所產生的無狀態會話進行有效管理,提出采用Redis緩存服務器技術來管理用戶端和服務器之間所產生的無狀態會話,并通過實驗證實了采用該技術能有效管理用戶訪問系統所產生的無狀態會話,同時還可以優化系統性能,提高用戶體驗感。
關鍵詞:Redis緩存;Session;會話管理
中圖分類號:TP311.5? ? ? 文獻標識碼:A
文章編號:1009-3044(2021)12-0090-03
1 背景
HTTP協議屬于無狀態分布式通信協議,也就是服務器每響應一次用戶請求后就會丟失和用戶之間的聯系,因此當接收下一個用戶請求時無法判斷該請求是否來自相同的用戶,也就無法有效地去記錄用戶所進行的操作和用戶的狀態等重要信息。而在Web應用中,通常需要記錄和跟蹤用戶的會話狀態,用于對用戶進行身份認證、訪問控制等[1]。
而伴隨著需求的增長,對用戶的登錄,權限等狀態的會話信息管理已成為不可避免的話題。平常在進行Web開發時,需要和Web服務進行打交道,Web服務是種無狀態的會話機制和HTTP協議類似。因此要對用戶的會話狀態進行管理則需要使用其他的方式進行實現。
基于此,本文采用Redis分布式緩存技術設計并實現了在Web應用中對無狀態會話進行管理,并且該技術能滿足會話管理在應用上的需求。
2 Redis概述
2.1 Redis的特點
Redis是一個以鍵值對為存儲方式的分布式系統,同時也是NoSQL 技術陣營中重要的成員之一。 Redis不僅存儲效率高、支持使用多種不同的數據類型、事務操作是原子性的、還擁有豐富的特性,支持publish/subscribe、通知、key過期等特性[2]。能進一步提高系統數據的完整性以及一致性。Redis既有對于不同的常見數據類型相同的指令,也有對于不同數據類型的特殊指令。此外Jedis是Redis的Java版本客戶端,Jedis可以像Java那樣進行多線程處理,以及使用線程來對系統資源進行優化處理,提高系統資源利用率和Redis 的使用效率。在提高數據獲取速度時,我們需要用一些緩存技術,Redis的最大優勢在于可將數據緩存到內存并能夠分片存儲,同時擁有很高的讀寫效率[3]。
2.2 Redis的存儲及數據恢復方式
Redis存儲機制的默認設置是:當更改了一個Key,那么從更改之時算起,在15分鐘之后Redis進行一次持久化的數據存儲操作。當更改了十個Key則自修改之時起5分鐘后Redis進行一次持久化的數據存儲操作,在完成持久化存儲后,會將臨時文件替換掉之前的RDB文件,完成數據的更新。此外,Redis在存儲一些特殊數據信息時,如手機號碼、imsi碼等,采用a-z,A-Z,0-9組成的62進制替代10進制可以大大地節約內存,手機號碼可以從11位壓縮到6位,imsi碼可以從15位壓縮到9位[4]。通過這種方式可以進一步壓縮數據信息所占用的內存。
通過RDB進行數據恢復的方式也很簡單,這里介紹兩種方式:
1)第一種,重啟。只用重新啟動Redis的服務就可以完成對數據的恢復。因為在啟動時,RedisSever會先從Dump.rdb文件進行數據的同步;
2)第二種,利用AOF文件進行恢復。該方法是記錄下來在Redis服務中已經執行過的指令,在進行恢復數據的時候,在AOF文件中按照從前往后的順序將指令再次執行一遍以此來達到數據恢復的目的。采用這種方式的優點是,能夠更好地保持數據的完整。采用種方式的缺點是,AOF文件比RDB文件大,并且采用AOF進行數據恢復速度較慢,因為它主要是記錄執行過程中的操作指令。
為了能更好地體現出Redis緩存技術的作用和優勢,一般需要在另一個服務器上搭建一個分布式系統。使用傳統的關系型數據庫遠遠不能滿足互聯網業務中存儲大量數據的需求。此外,在實際應用中,傳統的關系型數據庫不能實時的統計和更新多種不同類型的數據資源。因此Redis在分布式系統上搭建好之后可以通過Redis確定各個影響數據存儲有效性的影響因素,實現對分布式數據的可靠性評測和存儲[5]。
3 Redis會話管理技術
3.1 有狀態會話和無狀態會話概述
平常在進行web開發時會遇到session,而平常所遇到的這些session統稱為有狀態session,所謂有狀態session,就是在一個網站上,用戶進行登錄,登錄成功后就會產生一個會話(session),這時如果有兩個或者更多的用戶來訪問的話就會產生兩個甚至多個的session,如圖1所示,這些session都是用于維護我們系統和用戶之間的會話,建立起連接后,系統可以在不同方法調用期間保持和維護用戶的狀態,通常對系統的開銷較大。如果會話消失,也就是說用戶沒有訪問我們的網站。當用戶下次要再次進行訪問時,或者要再次對網站進行操作時則需要再次進行驗證,只有驗證通過后,才能建立連接。
無狀態session,就是指用戶在調用系統中的不同方法時,不會保留任何狀態,當然,由于是無狀態的,所以占用的資源通常較少。假設有一套系統,有用戶進行登錄,但是在登錄之后并沒有將用戶信息存儲到session中去,那么用戶去訪問系統的時候其實是沒有會話的,也就是沒有session這種東西,這時如果有兩個或者更多的用戶來訪問我們這個系統其實都是沒有會話的,那這樣的話,是沒辦法維護系統和用戶之間的關系,因為用戶訪問一次我們這個系統,它的連接就斷開了,當下次再要進行訪問時,就必須重新去建立連接。那么這樣子就稱之為無狀態session。對于無狀態session,一般來說,我們還是要在后端對它進行一定的控制。
3.2 采用Redis-Session實現無狀態會話管理分析
欲用一種方式去管理和維護無狀態Session,既然Web容器也就是tomcat無法去做到的話,那么此時就可以去依靠Redis,也就是一直所談到的緩存。
Redis-Session,當App用戶,去訪問這個系統的時候,就會產生一個User-Redis-Session,這樣的一個Session就是把用戶信息,以一個JSON的形式,把整個對象保存到Redis緩存中去就可以了,那么當然,緩存和有狀態session可以說是類似的,是一個鍵值對。另外,對Redis也可以對用戶設置一定的時間,比如說30分鐘或者一個小時后無操作該User-Redis-Session自動失效。當然,當有更多的App用戶來訪問系統的時候,所產生的User-Redis-Session會越來越多。如圖2所示。
像這種Redis-Session都可以直接存儲到緩存里面去,不管是單機Redis還是集群Redis,都是沒有問題的。
使用Redis-Session的好處:
1)用戶信息存儲到Redis緩存中,形成無狀態會話,便于管理。
2)便于擴展,當一個單體應用擴展成集群的時候會相當方便。在我們的集成環境中,不管我們用戶訪問到我們的哪一節點,我們的用戶緩存,用戶Session全部都可以被訪問到。這樣就會相當方便。
3)便于權限驗證。如果想獲取到當前訪問系統的App用戶信息,則可以在后端設置一個攔截器,在該攔截器中可以直接獲取到Redis-Session中的用戶信息,從而用于識別該用戶的權限。
3.3 Redis配置文件編寫
Redis的配置文件信息如圖3所示:
1)redis.hostname:Redis的服務器地址。這里由于部署Redis時,使用的是另一臺服務器進行的部署,而這臺服務器的IP地址是121.199.58.0,所以Redis的服務器地址就是121.199.58.0。
2)redis.port:Redis的端口號,這里采用的是它默認的端口號6379.
3)redis.pool.maxActive:Redis連接池最大能連接的數量,這里設置的是100。
4)redis.pool.maxIdle:Redis連接池最大的空閑連接數量,數量如果超過最大空閑連接數,則會直接將該對象丟棄。
5)redis.pool.maxWait:Redis連接池最大阻塞等待時間,在建立用戶和Redis之間連接的時候所需要的最大的等待時間,當設置為負值是,就表示等待的時間無上限。這里設置的是3000毫秒。
6)redis.pool.testOnBorrow:Borrow一個Jedis實例的時候,是否需要進行alidate操作。這里設置為true,表示得到的Jedis對象都是可以使用的。
4 Redis實現無狀態會話管理實驗結果及分析。
4.1 實驗預期和結果分析
用戶在進行登錄時,系統為用戶生成一個唯一的token,同時將用戶的ID作為鍵,token作為值一并存入到redis中,這樣便能建立用戶和系統的聯系了,同時,當系統需要對該用戶的某些權限時,直接到redis中,通過用戶ID便能直接獲取到用戶的信息。
以下通過采用RedisDesktopManager圖形化Redis管理工具展示實驗結果:
如圖4所示。
當用戶登錄成功時,系統會將用戶的ID作為鍵,也就是圖中的STRING,并將系統為該用戶生成的唯一token(圖中的Value)作為值緩存到redis數據庫中。此外,與傳統意義上的有狀態Session相比較,redis能同時允許多個用戶在同一臺電腦,同一個瀏覽器上進行登錄。因為對于傳統的有狀態session,一個瀏覽器只能和一個用戶進行連接。當多個用戶進行登錄時,后登錄用戶的往往會把之前登錄的用戶的session給替換掉,對于開發人員,在對不同角色的用戶進行測試時,造成極大不便。當采用Redis-Session對用戶的無狀態會話進行管理時,可以有效地保存用戶的登錄狀態,并且這里同時登錄了兩個賬號,但是并沒有出現被后登錄用戶覆蓋前一個用戶的問題,相比較于有狀態會話,無狀態會話所耗費的服務器資源更少,能顯著地提高系統的性能和用戶體驗感。
4.2 使用無狀態會話和有狀態會話性能對比分析
如表1所列,無狀態會話在多項性能指標上優于有狀態會話,但是無狀態會話并不是適用于所有的場景,當出現需要進行頻繁訪問,且訪問之間需要進行一些信息的共享,這個時候就應該選擇有狀態會話。然而,當系統中涉及一些不常使用的功能時,無狀態會話的優先級高于有狀態會話。
5 結束語
基于Redis的無狀態會話管理技術可以有效地管理用戶在訪問系統時所產生的無狀態會話,并且通過實驗及對比,證實了,無狀態會話的管理不僅能有效的管理用戶的狀態,且系統開銷小于有狀態會話,能極大改善系統性能,提高用戶體驗感。
參考文獻:
[1] 陽瑞發.基于攔截器的Web服務會話技術研究[J].制造業自動化,2015,37(20):54-55.
[2] 寧方美,賀雪梅,牟晉娟.SpringBoot集成Redis緩存技術在企業一卡通系統中的應用[J].電子技術與軟件工程,2019(24):133-134.
[3] 葉朋.網站訪問性能優化的研究與實現[D].哈爾濱:哈爾濱理工大學,2020.
[4] 徐茂紅,王飛,張明.基于大數據量的Redis技術應用與研究[J].信息技術與信息化,2019(11):228-230.
[5] 宋云奎,吳文鵬,趙磊,等.基于Redis的分布式數據存儲方法[J].計算機產品與流通,2020(8):106.
【通聯編輯:謝媛媛】