分散式中使用 Redis 實現 Session 共享(上)

發表於2015-09-23

上一篇介紹瞭如何使用nginx+iis部署一個簡單的分散式系統,文章結尾留下了幾個問題,其中一個是”如何解決多站點下Session共享”。這篇文章將會介紹如何使用Redis,下一篇在此基礎上實現Session。

這裡特別說明一下,其實沒有必要使用Redis來解決Session共享。Asp.net提供了StateServer模式來共享Session,這裡重複造輪子的目的1:熟悉Redis的基本知識和使用 2.學習和鞏固Session的實現原理。

 

Redis安裝配置

redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)、zset(sorted set –有序集合)和hash(雜湊型別)。這些資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是快取在記憶體中。區別的是redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。

最新版本的redis版本為3.0.3,支援叢集功能。我這下載的是window版本的,實際場景都是安裝在linux系統下的。下載地址:redis-2.8.19.rar 。更多下載地址:

官網 :http://redis.io/download MSOpenTech:https://github.com/MSOpenTech/redis  dmajkic:https://github.com/dmajkic/redis/downloads
下載完成之後解壓執行redis-server.exe就啟動了redis了,啟動後會在程式裡面看到reids。

1.讀寫分離配置

redis的讀寫分離需要修改配置檔案,把解壓的檔案複製了一份。兩份檔案是一樣的,分別命名為MasterRedis-2.8.19(主redis服務),SlaveRedis-2.8.19(從redis服務)。redis預設繫結的是6379埠,

我們保持主服務配置不變,修改從服務配置。

  • 修改從服務繫結埠(修改時可以直接搜尋port關鍵字)

  • 修改從服務對應的主服務地址(修改時可以直接搜尋slaveof關鍵字)

  • 配置檔案修改完成以後,分別啟動主服務和從服務

從服務啟動以後,主服務會傳送一條同步的sync命令,同步從伺服器的快取資料。
五種資料型別使用

服務搭建好以後可以使用.net版本redis操作類庫ServiceStack.Redis來操作redis,本文會用到以下三個dll。

初始化RedisClient物件

1.String

String是最常用的一種資料型別,普通的key/value儲存都可以歸為此類,value其實不僅是String,也可以是數字:比如想知道什麼時候封鎖一個IP地址(訪問超過幾次)。INCRBY命令讓這些變得很容易,通過原子遞增保持計數。


2.Hash

一個hashid可以儲存多項資訊,每一項資訊也有自己的key


3.List

應用場景:

  • Redis list的應用場景非常多,也是Redis最重要的資料結構之一。
  • 我們可以輕鬆地實現最新訊息排行等功能。
  • Lists的另一個應用就是訊息佇列,可以利用Lists的PUSH操作,將任務存在Lists中,然後工作執行緒再用POP操作將任務取出進行執行。


4.Set

應用場景:

  • Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在於set是可以自動排重的,當你需要儲存一個列表資料,又不希望出現重複資料時,set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的重要介面,這個也是list所不能提供的。
  • 比如在微博應用中,每個人的好友存在一個集合(set)中,這樣求兩個人的共同好友的操作,可能就只需要用求交集命令即可。
  • Redis還為集合提供了求交集、並集、差集等操作,可以非常方便的實

5.Sort Set(排序)

應用場景:

  • 以某個條件為權重,比如按頂的次數排序.
  • ZREVRANGE命令可以用來按照得分來獲取前100名的使用者,ZRANK可以用來獲取使用者排名,非常直接而且操作容易。
  • Redis sorted set的使用場景與set類似,區別是set不是自動有序的,而sorted set可以通過使用者額外提供一個優先順序(score)的引數來為成員排序,並且是插入有序的,即自動排序。
  • 比如:twitter 的public timeline可以以發表時間作為score來儲存,這樣獲取時就是自動按時間排好序的。
  • 比如:全班同學成績的SortedSets,value可以是同學的學號,而score就可以是其考試得分,這樣資料插入集合的,就已經進行了天然的排序。
  • 另外還可以用Sorted Sets來做帶權重的佇列,比如普通訊息的score為1,重要訊息的score為2,然後工作執行緒可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行。

 

封裝擴充

最後提供一份別人寫好的Redis操作的幫助類,用到了PooledRedisClientManager連線池來獲取RedisClient,同時用到了讀寫分離的概念,可以直接拿來使用

使用很簡單,幾行程式碼

連線池的初始化

配置檔案

總結

1.其實php,java等多種語言都能使用redis,在我接觸的專案中見到使用redis做為訊息佇列和快取元件,當然它的功能遠不止於此。後面的文章將詳細介紹redis的幾個使用案例。

2.可以使用redis desktop manager管理工具檢視伺服器快取中的資料

相關文章