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
>
初始化配置
staticmanagers()
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,攔截使用者的所有請求namespacetest
}}
在global.asax中要註冊一下publicstatic
void
registerglobalfilters(globalfiltercollection filters)
protected
void
為了方便呼叫借用4.0中的新特性,把controller新增乙個擴充套件屬性publicstatic
class
extsessions
}
呼叫方法
publicclass
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...