asp.net mvc 用Redis實現分布式集群共享Session。

1、這兩天研究Redis搞分布式session問題,網上找的資料都是用ServiceStack.Redis來實現的,但是在做性能測試的時候發現最新的v4版本有限制每小時候最多請求6000次,因為官網開始商業化要收費了,好坑爹的說,還好我前期弄了個性能測試列子,不然上線以后出問題那就麻煩了。后面找了個NServiceKit.Redis(好像就是ServiceStack.Redis的v3版本)來替代v4的收費版。

2、解決方案是 Redis+cookie方式實現記錄用戶登錄狀態

? ? ?cookie:存放用戶的ID,這個ID是經過加密的,并且后臺可以通過密鑰解密。

? ? ?Redis:key/value 方式存儲,key存放比如:user_1。 ?value存放用戶實體對象。

3、先安裝一個Redis,windows的版本在本地進行測試,后期上線更換linux系統的Redis替換一下ip就可以了。

4、添加一個Session管理類

public class SessionHelper{private const int secondsTimeOut = 60 * 20;  //默認過期時間20分鐘  單位秒public RedisHelper Redis = new RedisHelper(false);public LoginUserInfo this[string key]{get{string webCookie = WebHelper.GetCookie(key);if (webCookie == ""){return null;}key = key + "_" + SecureHelper.AESDecrypt(webCookie);//距離過期時間還有多少秒long l = Redis.TTL(key);if (l >= 0){Redis.Expire(key, secondsTimeOut);}return Redis.Get<LoginUserInfo>(key);}set{SetSession(key, value);}}public void SetSession(string key, LoginUserInfo value){if (string.IsNullOrWhiteSpace(key)){throw new Exception("Key is Null or Epmty");}WebHelper.SetCookie(key, SecureHelper.AESEncrypt(value.ID.ToString()));key = key + "_" + value.ID;Redis.Set<LoginUserInfo>(key, value, secondsTimeOut);}/// <summary>/// 移除Session/// </summary>/// <param name="key"></param>/// <returns></returns>public bool Remove(string key){var rs = Redis.Remove(key + "_" + SecureHelper.AESDecrypt(WebHelper.GetCookie(key)));WebHelper.DeleteCookie(key);return rs;}}

5、Redis操作類

public class RedisHelper : IDisposable{private RedisClient Redis = new RedisClient("127.0.0.1", 6379);//緩存池PooledRedisClientManager prcm = new PooledRedisClientManager();//默認緩存過期時間單位秒public int secondsTimeOut = 20 * 60;/// <summary>/// 緩沖池/// </summary>/// <param name="readWriteHosts"></param>/// <param name="readOnlyHosts"></param>/// <returns></returns>public static PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts){return new PooledRedisClientManager(readWriteHosts, readOnlyHosts,new RedisClientManagerConfig{MaxWritePoolSize = readWriteHosts.Length * 5,MaxReadPoolSize = readOnlyHosts.Length * 5,AutoStart = true,}); }/// <summary>/// 構造函數/// </summary>/// <param name="OpenPooledRedis">是否開啟緩沖池</param>public RedisHelper(bool OpenPooledRedis = false){if (OpenPooledRedis){prcm = CreateManager(new string[] { "127.0.0.1:6379" }, new string[] { "127.0.0.1:6379" });Redis = prcm.GetClient() as RedisClient;}}/// <summary>/// 距離過期時間還有多少秒/// </summary>/// <param name="key"></param>/// <returns></returns>public long TTL(string key){return Redis.Ttl(key);}/// <summary>/// 設置過期時間/// </summary>/// <param name="key"></param>/// <param name="timeout"></param>public void Expire(string key,int timeout = 0){if (timeout >= 0){if (timeout > 0){secondsTimeOut = timeout;}Redis.Expire(key, secondsTimeOut);}}#region Key/Value存儲/// <summary>/// 設置緩存/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key">緩存建</param>/// <param name="t">緩存值</param>/// <param name="timeout">過期時間,單位秒,-1:不過期,0:默認過期時間</param>/// <returns></returns>public bool Set<T>(string key, T t, int timeout = 0){Redis.Set<T>(key, t);if (timeout >= 0){if (timeout > 0){secondsTimeOut = timeout;}Redis.Expire(key, secondsTimeOut);}return true;}/// <summary>/// 獲取/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public T Get<T>(string key){return Redis.Get<T>(key);}/// <summary>/// 刪除/// </summary>/// <param name="key"></param>/// <returns></returns>public bool Remove(string key){return Redis.Remove(key);}#endregion//釋放資源public void Dispose(){if (Redis != null){Redis.Dispose();Redis = null;}GC.Collect();}}

?

轉載于:https://www.cnblogs.com/valen/p/4655427.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397817.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397817.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397817.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何用計算機求和,求和計算器

求和計算器您可以使用此求和計算器快速計算預定范圍內某個表達式的序列之和。如何使用求和計算器輸入總和的表達式輸入上限和下限提供表達式中使用的變量的詳細信息單擊“計算”按鈕生成結果。求和Σ符號計算器k ∑n 0變量:nixyzabc 103740支持的運算符常量和函數算術運算符加“…

Zookeeper概述、特點、數據模型

Zookeeper1.Zookeeper概述Zookeeper是一個工具&#xff0c;可以實現集群中的分布式協調服務。所謂的分布式協調服務&#xff0c;就是在集群的節點中進行可靠的消息傳遞&#xff0c;來協調集群的工作。Zookeeper之所以能夠實現分布式協調服務&#xff0c;靠的就是它能夠保證分布…

云計算機創意名,有創意的道路名字推薦,分享一些好聽有內涵的路名

提到龍崗板塊&#xff0c;“風向”一直飄忽不定。原本地鐵4號線今年通車&#xff0c;但是因為五象火車站的規劃建設&#xff0c;暫時未開通;機場線已經敲定&#xff0c;然而沒有龍崗的份…… [本文來自&#xff1a;www.777y.com]雖然機場線暫時無緣(可以期待下)&#xff0c;但是…

250W電源帶i7+GTX1080?

電源的科學: Q1&#xff1a;電源的額定功率是什么&#xff1f;峰值功率又是什么&#xff1f;A1&#xff1a;電源的額定功率就是電源正常工作時的功率&#xff0c;它的值為用電器的額定電壓乘以額定電流。而峰值功率指的是電源短時間內能達到的最大功率&#xff0c; 一般情況下電…

uml里的extend和include_用例圖中包含(include)擴展(extend)和泛化(generalization)關系詳解...

標簽&#xff1a;uml用例圖是解決用戶需求的圖&#xff0c;畫好用例圖一定要理清用例之間的關系。用例之間有三種關系&#xff1a;包含(include)擴展(extend)和泛化(generalization)。下面介紹三者的相同點和不同點以便區分&#xff1a;相同點&#xff1a; 三者都是從現有的用例…

數據庫的數據類型及運算符

一、數據類型 1、整數類形&#xff1a; &#xff08;重點記憶&#xff0c;常用&#xff09;有符號整形&#xff1a;int--每個int類型的數據按4個字節存儲&#xff0c;其中1位表示整數值的正負號&#xff0c;其他31位表示整數值長度和大小&#xff1b; 大整形&#xff1a;bigint…

浙江大學計算機博士很難復試專業課,浙江大學計算機學院2020年博士研究生招生復試公告...

一、復試資格通過計算機學院博士生材料初審的考生獲得復試資格&#xff0c;名單見附件。二、復試內容和成績組成博士研究生的復試內容主要包括對考生思想政治素質和品德、學術水平考核。1&#xff0e; 思想政治素質和道德品質考核思想政治素質和品德考核是博士研究生招生復試的…

推薦幾款熱門的敏捷開發工具

不知道有多少企業在很好的應用敏捷模式&#xff1b; 在今天的文章中&#xff0c;我們將一同了解更多有趣、高效且面向敏捷的項目管理工具。 Atlassian Jira/ Jira Agile   Atlassian的Jira是一款熱門工具&#xff0c;用于追蹤產品開發、幫助團隊組織問題、分配工作并保證團隊…

語言語法糖_【c#】幾種常用語法糖

語法糖&#xff08;syntactic sugar&#xff09;是由英國計算機科學家Peter J. Landin發明的術語&#xff0c;指計算機語言中添加的某種語法。這種語法不影響語言的功能&#xff0c;但更方便使用。在開發中使用語法糖能夠讓程序變得更短&#xff0c;使看起來更美觀些~空檢查pub…

CodeForces 696B Puzzles

思維&#xff0c;簡單樹$dp$。 首先計算出每一個子樹包含多少個節點&#xff0c;記為$f[i]$。然后就可以從$root$開始推出所有節點的期望了。 現在已知$fa$節點的答案為$ans[fa]$&#xff0c;假設要計算$fa$的一個兒子$v$的期望&#xff0c;那么$ans[v]ans[fa]1.0(f[fa]-f[v]-1…

2018清華計算機類專業錄取分數線,清華大學2018年各省錄取分數線及各專業錄取分數線 - 高教網...

【一批錄取分數線】港澳臺聯招&#xff1a;630分安徽&#xff1a;理科689分&#xff1b;文科675分&#xff1b;理科定向683分北京&#xff1a;理科694分&#xff1b;文科677分福建&#xff1a;理科681分&#xff1b;文科650分甘肅&#xff1a;理科652分&#xff1b;文科637分廣…

ASP.NET 對類進行XML序列化和反序列化

1 序列化方法 public void SerializeObject<T>(string Xmlname,T t){XmlSerializer ser new XmlSerializer(typeof(T));TextWriter writer new StreamWriter(Xmlname);ser.Serialize(writer, t);//要序列化的對象writer.Close();} 2 序列化方法的使用 NodeConfigInfo n…

python100內3整除while_python-循環語句-習題及答案-for-while

for 變量 in range(起始&#xff0c;終止&#xff0c;步長):循環體變量 起始while 終止條件(bool):循環體步長break continue1. 盈盈為了考驗令狐沖奪冠的決心&#xff0c;要他說一百遍“我能行&#xff01;”# for i in range(0,100,1):# print("我能行")2.本金100…

怎么用計算機連接電視,電腦怎么連接電視 詳細步驟【圖文】

現在一般的LED電視機都有連接電腦的功能&#xff0c;如何讓電腦連接電視&#xff0c;讓電視的大屏幕成為電腦的顯示器呢?下面給大家說明電腦連接電視詳細步驟!電腦連接電視步驟&#xff1a;1 電腦連接電視所需的接口及連接線我們先來介紹一下&#xff0c;電視上需要的接口&…

PC-CSS-多瀏覽器支持HTML5

非IE:article, section, aside, hgroup, nav, header, footer, figure, figcaption {display: block;}IE&#xff1a;<script>document.createElement(‘article’);document.createElement(‘section’);document.createElement(‘aside’);document.createElement(‘hg…

4r照片尺寸是多大_數碼照片4D、4R、6RW是什么意思,怎樣調整4D照片尺寸?

數碼照片4D、4R、6RW是什么意思,怎樣調整4D照片尺寸?數碼相機和DV進入尋常百姓家&#xff0c;有些朋友希望把外出旅游或者居家時拍的照片沖印出來&#xff0c;但是一些朋友對里面的專業說法不太熟悉&#xff0c;比如3R,4R,4D,5D,5R,6R等照片的規格和尺寸不清楚&#xff0c;其實…

javascript 盒子模型

oDiv.clientWidth---》width左右padding oDiv.clientHeight---》height上下padding oDiv.clientTop---》上邊框的高度 oDiv.clientLeft---》左邊框的寬度 oDiv.offsetWidth---》clientWidth左右邊框的寬度 oDiv.offsetHeight---》clientHeight上下邊框的高度 offsetLeft---》當…

html自定義列表 嵌套,HTML 列表

HTML 支持有序、無序和定義列表:HTML 列表有序列表The first list itemThe second list itemThe third list item無序列表List itemList itemList item在線實例無序列表本例演示無序列表。有序列表本例演示有序列表。(可以在本頁底端找到更多實例。)HTML無序列表無序列表是一個…

shiro會話監聽_SpringBoot集成Shiro會話管理

在Shiro中我們可以通過org.apache.shiro.session.mgt.eis.SessionDAO對象的getActiveSessions()方法方便的獲取到當前所有有效的Session對象。通過這些Session對象&#xff0c;我們可以實現一些比較有趣的功能&#xff0c;比如查看當前系統的在線人數&#xff0c;查看這些在線用…

JAVA程序員面試必知32個知識點

第一&#xff0c;談談final, finally, finalize的區別。 final 用于聲明屬性&#xff0c;方法和類&#xff0c;分別表示屬性不可變&#xff0c;方法不可覆蓋&#xff0c;類不可繼承。finally是異常處理語句結構的一部分&#xff0c;表示總是執行。finalize是 Object類的一個方法…