asp.net redis 協助類封裝

來源:互聯網
上載者:User

標籤:.config   html   max   finalize   ldb   gets   dex   初始   may   

問題:in C# Redis : could not connect to redis Instance at 127.0.0.1:6379  (有時候訪問不了,重新整理又可訪問)

使用的是ServiceStack.redis 版本 2.2 ,據說版本4+ 要收費。

代碼:開始用    var result=new RedisClient("127.0.0.1",6379,1"1111"); 

 

後面改為串連池(叢集的方式)/// <summary>/// 串連用戶端管理/// </summary>private static PooledRedisClientManager prcm;/// <summary>/// 建立連結池管理對象/// </summary>public static PooledRedisClientManager CreateManager(){string[] writeServerList = SplitString(redisConfigInfo.WriteServerList, ",");string[] readServerList = SplitString(redisConfigInfo.ReadServerList, ",");return new PooledRedisClientManager(writeServerList, readServerList,new RedisClientManagerConfig{MaxWritePoolSize = redisConfigInfo.MaxWritePoolSize,MaxReadPoolSize = redisConfigInfo.MaxReadPoolSize,DefaultDb = redisConfigInfo.InitalDb,AutoStart = redisConfigInfo.AutoStart,}); //, redisConfigInfo.InitalDb}  /// <summary>/// 用戶端快取作業對象/// </summary>public static IRedisClient GetClient(){if (OpenRedis){if (prcm == null){ prcm = CreateManager();}return prcm.GetClient();}return null;} 但發現用同一個還是串連池並發大還是有問題,從日誌上面看Redis Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use.異常資訊:System.TimeoutException: Redis Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use. could not connect to redis Instance at 127.0.0.1:6379異常資訊:ServiceStack.Redis.RedisException: could not connect to redis Instance at 127.0.0.1:6379 ---> System.Net.Sockets.SocketException: 在一個非通訊端上嘗試了一個操作。 127.0.0.1:6379 後面在網上尋找的時候看到使用using 的方法。 跟串連資料庫一樣的道理,還有開多線程會報錯,要加local鎖RedisConfigInfo類using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using System.Web;namespace Cache.Redis{/// <summary>/// 擷取redis配置的類/// </summary>public sealed class RedisConfigInfo:ConfigurationSection{public static RedisConfigInfo GetConfig(){var section = (RedisConfigInfo)System.Configuration.ConfigurationManager.GetSection("RedisConfig");return section;}public static RedisConfigInfo GetConfig(string sectionName){var section = (RedisConfigInfo)ConfigurationManager.GetSection("RedisConfig");if (section == null){throw new ConfigurationErrorsException("Section " + sectionName + " is not found.");}return section;}/// <summary>/// 可寫的Redis連結地址/// </summary>[ConfigurationProperty("WriteServerList", IsRequired = false)]public string WriteServerList{get{return (string)base["WriteServerList"];}set {base["WriteServerList"] = value;}}/// <summary>/// 可讀的Redis連結地址,它一般由多個伺服器組件,一般稱為從伺服器(slave),各個伺服器之間用逗號分開/// </summary>[ConfigurationProperty("ReadServerList", IsRequired = false)]public string ReadServerList{get{return (string)base["ReadServerList"];}set{base["ReadServerList"] = value;}}/// <summary>/// 最大寫連結數/// </summary>[ConfigurationProperty("MaxWritePoolSize", IsRequired = false, DefaultValue = 5)]public int MaxWritePoolSize{get{return (int)base["MaxWritePoolSize"];}set{base["MaxWritePoolSize"] = value;}} /// <summary>/// 初始化哪個庫/// </summary>[ConfigurationProperty("InitalDb", IsRequired = false)]public long InitalDb{get{return (long)base["InitalDb"];}set{base["InitalDb"] = value;}}/// <summary>/// 最大寫連結數/// </summary>[ConfigurationProperty("MaxReadPoolSize", IsRequired = false, DefaultValue = 5)]public int MaxReadPoolSize{get{return (int)base["MaxReadPoolSize"];}set{base["MaxReadPoolSize"] = value;}}/// <summary>/// 自動重啟/// </summary>[ConfigurationProperty("AutoStart", IsRequired = false, DefaultValue = true)]public bool AutoStart{get{return (bool)base["AutoStart"];}set{base["AutoStart"] = value;}} /// <summary>/// 本機快取到期時間,單位:秒/// </summary>[ConfigurationProperty("LocalCacheTime", IsRequired = false, DefaultValue = 36000)]public int LocalCacheTime{get{return (int)base["LocalCacheTime"];}set{base["LocalCacheTime"] = value;}} /// <summary>/// 是否記錄日誌,該設定僅用於排查redis運行時出現的問題,如redis工作正常,請關閉該項/// </summary>[ConfigurationProperty("RecordeLog", IsRequired = false, DefaultValue = false)]public bool RecordeLog{get{return (bool)base["RecordeLog"];}set{base["RecordeLog"] = value;}}/// <summary>/// 逾時時間/// </summary>[ConfigurationProperty("PoolTimeOutSeconds", IsRequired = false, DefaultValue = 5000)]public int PoolTimeOutSeconds{get{return (int)base["PoolTimeOutSeconds"];}set{base["PoolTimeOutSeconds"] = value;}}}} RedisOperatorBase類using ServiceStack.Redis;using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace Cache.Redis{/// <summary>/// Redis回收類/// </summary>public abstract class RedisOperatorBase : IDisposable{protected static object lockobj = new object();private bool _disposed = false;protected RedisOperatorBase(){}protected virtual void Dispose(bool disposing){if (!this._disposed){if (disposing){}}this._disposed = true;}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}/// <summary>/// 儲存資料DB檔案到硬碟/// </summary>public void Save(){}/// <summary>/// 非同步儲存資料DB檔案到硬碟/// </summary>public void SaveAsync(){}}} RedisManager  redis管理的類using System;using System.Collections.Generic;using System.Linq;using System.Text;using ServiceStack.Redis;namespace Cache.Redis{/// <summary>/// redis管理的類/// </summary>public class RedisManager{public static bool OpenRedis = System.Configuration.ConfigurationManager.AppSettings["OpenRedis"] == null ? false : Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["OpenRedis"]);/// <summary>/// redis設定檔資訊/// </summary>private static RedisConfigInfo redisConfigInfo = RedisConfigInfo.GetConfig(); /// <summary>/// 建立連結池管理對象/// </summary>public static PooledRedisClientManager CreateManager(){string[] writeServerList = SplitString(redisConfigInfo.WriteServerList, ",");string[] readServerList = SplitString(redisConfigInfo.ReadServerList, ",");return new PooledRedisClientManager(writeServerList, readServerList,new RedisClientManagerConfig{MaxWritePoolSize = redisConfigInfo.MaxWritePoolSize,MaxReadPoolSize = redisConfigInfo.MaxReadPoolSize,DefaultDb = redisConfigInfo.InitalDb,AutoStart = redisConfigInfo.AutoStart,}); //, redisConfigInfo.InitalDb}/// <summary>/// 得到串連數組/// </summary>/// <param name="strSource"></param>/// <param name="split"></param>/// <returns></returns>private static string[] SplitString(string strSource, string split){return strSource.Split(split.ToArray());} }} Redis string get set的類 using ServiceStack.Redis;using ServiceStack.Text;using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace Cache.Redis{/// <summary>/// redis的string/// </summary>public class RedisStringOperator : RedisOperatorBase{public RedisStringOperator() : base() { }/// <summary>///redis的string 存值/// </summary>public bool Set<T>(string key, T t){if (!Cache.Redis.RedisManager.OpenRedis){return true;}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.Set(key, t);}}}/// <summary>/// redis的string存值/// </summary>public bool Set<T>(string key, T t, DateTime expiresAt){if (!Cache.Redis.RedisManager.OpenRedis){return true;}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.Set(key, t, expiresAt);}}//return Redis.Set(key, t, expiresAt);}/// <summary>/// 存值/// </summary>/// <param name="key"></param>/// <param name="value"></param>public bool Set(string key, string value){if (!Cache.Redis.RedisManager.OpenRedis){return true;}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.Set<string>(key, value);}}}/// <summary>/// 移除/// </summary>/// <param name="key"></param>/// <returns></returns>public bool Remove(string key){if (!Cache.Redis.RedisManager.OpenRedis){return true;}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.Remove(key);}}}/// <summary>/// 取值/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public T Get<T>(string key){if (!Cache.Redis.RedisManager.OpenRedis){return default(T);}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.Get<T>(key);}}}/// <summary>/// 設定緩衝到期/// </summary>public bool SetExpire(string key, DateTime datetime){if (!Cache.Redis.RedisManager.OpenRedis){return true;}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.ExpireEntryAt(key, datetime);}}} }} RedisHash的類 using ServiceStack.Text;using System;using System.Collections.Generic;namespace Cache.Redis{public class RedisHashOperator : RedisOperatorBase{public RedisHashOperator() : base() { }/// <summary>/// 判斷某個資料是否已經被緩衝/// </summary>public bool ExistHashContainsEntry(string hashId, string key){if (!Cache.Redis.RedisManager.OpenRedis){return true;}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.HashContainsEntry(hashId, key);}}}/// <summary>/// 儲存資料到hash表/// </summary>public bool SetInHash<T>(string hashId, string key, T t){if (!Cache.Redis.RedisManager.OpenRedis){return true;}var value = JsonSerializer.SerializeToString<T>(t);lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.SetEntryInHash(hashId, key, value);}}}/// <summary>/// 儲存資料到hash表/// </summary>/// <param name="hashId"></param>/// <param name="key"></param>/// <param name="t"></param>/// <returns></returns>public bool SetInHash(string hashId, string key, string value){if (!Cache.Redis.RedisManager.OpenRedis){return true;}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.SetEntryInHash(hashId, key, value);}}}/// <summary>/// 移除hash中的某值/// </summary>public bool RemoveFromHash(string hashId, string key){if (!Cache.Redis.RedisManager.OpenRedis){return true;}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.RemoveEntryFromHash(hashId, key);}}}///// <summary>///// 移除整個hash///// </summary>//public static bool Remove(string key)//{// return Redis.Remove(key);//}/// <summary>/// 從hash表擷取資料/// </summary>/// <typeparam name="T"></typeparam>/// <param name="hashId"></param>/// <param name="key"></param>/// <returns></returns>public T GetFromHash<T>(string hashId, string key){if (!Cache.Redis.RedisManager.OpenRedis){return default(T);}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){string value = redieclient.GetValueFromHash(hashId, key);return JsonSerializer.DeserializeFromString<T>(value);}}//string value = Redis.GetValueFromHash(hashId, key);//return JsonSerializer.DeserializeFromString<T>(value);} /// <summary>/// 從hash表擷取資料/// </summary>/// <param name="hashId"></param>/// <param name="key"></param>/// <returns></returns>public static string GetFromHash(string hashId, string key){if (!Cache.Redis.RedisManager.OpenRedis){return "";}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.GetValueFromHash(hashId, key);}}}/// <summary>/// 擷取整個hash的資料/// </summary>public static List<T> GetAllFromHash<T>(string hashId){if (!Cache.Redis.RedisManager.OpenRedis){return new List<T>();}var result = new List<T>();lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){var list = redieclient.GetHashValues(hashId);if (list != null && list.Count > 0){list.ForEach(x =>{var value = JsonSerializer.DeserializeFromString<T>(x);result.Add(value);});}}}return result;}/// <summary>/// 根據hash擷取keys/// </summary>/// <param name="hashId"></param>/// <returns></returns>public static List<string> GetHashKeys(string hashId){if (!Cache.Redis.RedisManager.OpenRedis){return new List<string>();}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.GetHashKeys(hashId);}}}/// <summary>/// 擷取整個hash的資料/// </summary>public static List<string> GetAllFromHash(string hashId){if (!Cache.Redis.RedisManager.OpenRedis){return new List<string>();}lock (lockobj){using (var redieclient = RedisManager.CreateManager().GetClient()){return redieclient.GetHashValues(hashId);}}}}}  比如string的set方法 <configSections><!--redis緩衝--><section name="RedisConfig" type="Cache.Redis.RedisConfigInfo,Cache" /></configSections><!--ServiceStack.Redis 4.0以後的版本的格式 [email protected]:port?&db=1&ssl=true&client=aaa&password=123&namespaceprefix=vvv&connecttimeout=10&sendtimeout=10&receivetimeout=10&retrytimeout=10&idletimeout=10--><!--redis緩衝 寫入地址(如果沒有密碼則不用@以及@之前的值,如127.0.0.1:6379,有密碼則[email protected]:6379) 讀的地址 預設資料庫是第幾個 最大逾時時間(秒) 最大寫連結數 最大讀的連結數 是否自動重啟 緩衝時間 是否寫入日誌 --><RedisConfig WriteServerList="127.0.0.1:6379" ReadServerList="127.0.0.1:6379" InitalDb="3" PoolTimeOutSeconds="5000" MaxWritePoolSize="5" MaxReadPoolSize="5" AutoStart="true" LocalCacheTime="180" RecordeLog="false"></RedisConfig>  string的 get 和set方法//// GET: /RedisTest/public ActionResult Index(){Cache.Redis.RedisStringOperator redistring = new Cache.Redis.RedisStringOperator();redistring.Set("test", 1);return View();} public ActionResult GetRedisValue(){Cache.Redis.RedisStringOperator redistring = new Cache.Redis.RedisStringOperator();redistring.Get<int>("test");}

  轉自:https://www.cnblogs.com/zhian/p/5669964.html

asp.net redis 協助類封裝

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.