用Redis實現Session功能,實現單點登入

2021-07-25 11:34:02 字數 3489 閱讀 4776

redis是乙個開源的使用ansi c語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、key-value資料庫,並提供多種語言的api

---維基百科

一般開發中使用者狀態使用session或者cookie,兩種方式各種利弊。

session:在inproc模式下容易丟失,並且引起併發問題。如果使用sqlserver或者sqlserver模式又消耗了效能

cookie則容易將一些使用者資訊暴露,加解密同樣也消耗了效能。

redis採用這樣的方案解決了幾個問題,

1.redis訪問速度快。

2.使用者資料不容易丟失。

3.使用者多的情況下容易支援集群。

5.能夠實現使用者一處登入。(通過**實現,後續介紹)

6.支援持久化。(當然可能沒什麼用)

1.我們知道session其實是在cookie中儲存了乙個sessionid,使用者每次訪問都將sessionid發給伺服器,伺服器通過id查詢使用者對應的狀態資料。

在這裡我的處理方式也是在cookie中定義乙個sessionid,程式需要取得使用者狀態時將sessionid做為key在redis中查詢。

2.同時session支援使用者在一定時間不訪問將session**。

借用redis中keys支援過期時間的特性支援這個功能,但是在續期方面需要程式自行攔截請求呼叫這個方法(demo有例子)

下面開始**說明

首先引用servicestack相關dll。

在web.config新增配置,這個配置用來設定redis呼叫位址每台服務用【,】隔開。主機寫在第一位

1

<

>23

4<

add

key="sessionredis"

value

="127.0.0.1:6384,127.0.0.1:6384"

/>56

>

初始化配置

static

managers()

if (string.isnullorempty(timeout)==false

)

var host = sessionredis.split(char.parse(","

));

var writehost = new

string ;

var readhosts = host.skip(1

).toarray();

clientmanagers = new pooledredisclientmanager(writehost, readhosts, new

redisclientmanagerconfig

);}

為了控制方便寫了乙個委託

///

///寫入

/// ///

//////

public f tryrediswrite(funcdowrite)

}catch

(redi***ception)

finally

}}

乙個呼叫的例子其他的具體看原始碼

///

///以key/value的形式儲存物件到快取中

/// ///

物件類別

///要寫入的集合

public

void kset(dictionaryvalue)

;tryrediswrite(fun);

}

按上面說的給cookie寫乙個sessionid

///

///使用者狀態管理

/// public

class

session

else

}}

去訪問使用者的方法

///

///獲取當前使用者資訊

/// ///

///public

object get() where t:class,new

()

//////

/// ///

public

bool

islogin()

//////

登入

/// ///

///public

void login(t obj) where t : class,new

()

預設使用者沒訪問超過30分鐘登出使用者的登入狀態,所以使用者每次訪問都要將使用者的登出時間推遲30分鐘

這需要呼叫redis的續期方法

///

///延期

/// ///

///public

void ksetentryin(string

key, timespan expirestime)

;tryrediswrite(fun);

}

封裝以後
///

///續期

///public

void

postpone()

這裡我利用了mvc3中的actionfilter,攔截使用者的所有請求
namespace

test

}}

在global.asax中要註冊一下
public

static

void

registerglobalfilters(globalfiltercollection filters)

protected

void

為了方便呼叫借用4.0中的新特性,把controller新增乙個擴充套件屬性

public

static

class

extsessions

}

呼叫方法

public

class

homecontroller : controller

}

後續將實現使用者一處登入功能

解決用Redis實現session持久化中的坑

本地tomcat conf context.xml 中加入 com.naritech.nicole.gump.redissessionhandlervalve com.naritech.nicole.gump.redissessionmanager host redis所在系統ip port 637...

Redis實現session共享

1.session共享是基於spring redis來實現的,首先從web.xml開始說起。2.在web.xml裡面配置了乙個filter,如下 springsessionrepositoryfilter org.springframework.web.filter.delegatingfilter...

redis實現session共享,實現單點登入

所需環境 兩台伺服器a和b模擬集群 兩台電腦 乙個mysql5.7,redis伺服器,demo分別部署在a和b中,a中名為demo1,b中名為demo2 為了加以區分 mysql5.7和redis都是在b中開啟的 測試原理 demo1在a中訪問login.jsp頁面登入進去之後會在瀏覽器儲存乙個js...