c#使用 StackExchange.Redis 封裝 RedisHelper
阿新 • • 發佈:2018-12-19
1.定義ICache介面。
2.Redis類和Memcached類,以後想用那個快取修改一下配置就可以了,非常方便。
3.CacheHelper的實現。
上程式碼:
ICache.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Common { public interface ICache { /// <summary> /// 快取過期時間 /// </summary> int TimeOut { set; get; } /// <summary> /// 獲得指定鍵的快取值 /// </summary> /// <param name="key">快取鍵</param> /// <returns>快取值</returns> object Get(string key); /// <summary> /// 獲得指定鍵的快取值 /// </summary> T Get<T>(string key); /// <summary> /// 從快取中移除指定鍵的快取值 /// </summary> /// <param name="key">快取鍵</param> void Remove(string key); /// <summary> /// 清空所有快取物件 /// </summary> //void Clear(); /// <summary> /// 將指定鍵的物件新增到快取中 /// </summary> /// <param name="key">快取鍵</param> /// <param name="data">快取值</param> void Insert(string key, object data); /// <summary> /// 將指定鍵的物件新增到快取中 /// </summary> /// <param name="key">快取鍵</param> /// <param name="data">快取值</param> void Insert<T>(string key, T data); /// <summary> /// 將指定鍵的物件新增到快取中,並指定過期時間 /// </summary> /// <param name="key">快取鍵</param> /// <param name="data">快取值</param> /// <param name="cacheTime">快取過期時間(秒鐘)</param> void Insert(string key, object data, int cacheTime); /// <summary> /// 將指定鍵的物件新增到快取中,並指定過期時間 /// </summary> /// <param name="key">快取鍵</param> /// <param name="data">快取值</param> /// <param name="cacheTime">快取過期時間(秒鐘)</param> void Insert<T>(string key, T data, int cacheTime); /// <summary> /// 將指定鍵的物件新增到快取中,並指定過期時間 /// </summary> /// <param name="key">快取鍵</param> /// <param name="data">快取值</param> /// <param name="cacheTime">快取過期時間</param> void Insert(string key, object data, DateTime cacheTime); /// <summary> /// 將指定鍵的物件新增到快取中,並指定過期時間 /// </summary> /// <param name="key">快取鍵</param> /// <param name="data">快取值</param> /// <param name="cacheTime">快取過期時間</param> void Insert<T>(string key, T data, DateTime cacheTime); /// <summary> /// 判斷key是否存在 /// </summary> bool Exists(string key); } }
Redis.cs
using Newtonsoft.Json; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Common { public class Redis : ICache { int Default_Timeout = 600;//預設超時時間(單位秒) string address; JsonSerializerSettings jsonConfig = new JsonSerializerSettings() { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore, NullValueHandling = NullValueHandling.Ignore }; ConnectionMultiplexer connectionMultiplexer; IDatabase database; class CacheObject<T> { public int ExpireTime { get; set; } public bool ForceOutofDate { get; set; } public T Value { get; set; } } public Redis() { this.address = ConfigurationManager.AppSettings["RedisServer"]; if (this.address == null || string.IsNullOrWhiteSpace(this.address.ToString())) throw new ApplicationException("配置檔案中未找到RedisServer的有效配置"); connectionMultiplexer = ConnectionMultiplexer.Connect(address); database = connectionMultiplexer.GetDatabase(); } /// <summary> /// 連線超時設定 /// </summary> public int TimeOut { get { return Default_Timeout; } set { Default_Timeout = value; } } public object Get(string key) { return Get<object>(key); } public T Get<T>(string key) { DateTime begin = DateTime.Now; var cacheValue = database.StringGet(key); DateTime endCache = DateTime.Now; var value = default(T); if (!cacheValue.IsNull) { var cacheObject = JsonConvert.DeserializeObject<CacheObject<T>>(cacheValue, jsonConfig); if (!cacheObject.ForceOutofDate) database.KeyExpire(key, new TimeSpan(0, 0, cacheObject.ExpireTime)); value = cacheObject.Value; } DateTime endJson = DateTime.Now; return value; } public void Insert(string key, object data) { var jsonData = GetJsonData(data, TimeOut, false); database.StringSet(key, jsonData); } public void Insert(string key, object data, int cacheTime) { var timeSpan = TimeSpan.FromSeconds(cacheTime); var jsonData = GetJsonData(data, TimeOut, true); database.StringSet(key, jsonData, timeSpan); } public void Insert(string key, object data, DateTime cacheTime) { var timeSpan = cacheTime - DateTime.Now; var jsonData = GetJsonData(data, TimeOut, true); database.StringSet(key, jsonData, timeSpan); } public void Insert<T>(string key, T data) { var jsonData = GetJsonData<T>(data, TimeOut, false); database.StringSet(key, jsonData); } public void Insert<T>(string key, T data, int cacheTime) { var timeSpan = TimeSpan.FromSeconds(cacheTime); var jsonData = GetJsonData<T>(data, TimeOut, true); database.StringSet(key, jsonData, timeSpan); } public void Insert<T>(string key, T data, DateTime cacheTime) { var timeSpan = cacheTime - DateTime.Now; var jsonData = GetJsonData<T>(data, TimeOut, true); database.StringSet(key, jsonData, timeSpan); } string GetJsonData(object data, int cacheTime, bool forceOutOfDate) { var cacheObject = new CacheObject<object>() { Value = data, ExpireTime = cacheTime, ForceOutofDate = forceOutOfDate }; return JsonConvert.SerializeObject(cacheObject, jsonConfig);//序列化物件 } string GetJsonData<T>(T data, int cacheTime, bool forceOutOfDate) { var cacheObject = new CacheObject<T>() { Value = data, ExpireTime = cacheTime, ForceOutofDate = forceOutOfDate }; return JsonConvert.SerializeObject(cacheObject, jsonConfig);//序列化物件 } /// <summary> /// 刪除 /// </summary> /// <param name="key"></param> public void Remove(string key) { database.KeyDelete(key, CommandFlags.HighPriority); } /// <summary> /// 判斷key是否存在 /// </summary> public bool Exists(string key) { return database.KeyExists(key); } } }
CacheHelper.cs
using System; using System.Collections.Generic; namespace Common { /// <summary> /// 快取 /// </summary> public static class Cache { private static object cacheLocker = new object();//快取鎖物件 private static ICache cache = null;//快取介面 static Cache() { Load(); } /// <summary> /// 載入快取 /// </summary> /// <exception cref=""></exception> private static void Load() { try { cache = new Redis(); } catch (Exception ex) { //Log.Error(ex.Message); } } public static ICache GetCache() { return cache; } /// <summary> /// 快取過期時間 /// </summary> public static int TimeOut { get { return cache.TimeOut; } set { lock (cacheLocker) { cache.TimeOut = value; } } } /// <summary> /// 獲得指定鍵的快取值 /// </summary> /// <param name="key">快取鍵</param> /// <returns>快取值</returns> public static object Get(string key) { if (string.IsNullOrWhiteSpace(key)) return null; return cache.Get(key); } /// <summary> /// 獲得指定鍵的快取值 /// </summary> /// <param name="key">快取鍵</param> /// <returns>快取值</returns> public static T Get<T>(string key) { return cache.Get<T>(key); } /// <summary> /// 將指定鍵的物件新增到快取中 /// </summary> /// <param name="key">快取鍵</param> /// <param name="data">快取值</param> public static void Insert(string key, object data) { if (string.IsNullOrWhiteSpace(key) || data == null) return; //lock (cacheLocker) { cache.Insert(key, data); } } /// <summary> /// 將指定鍵的物件新增到快取中 /// </summary> /// <param name="key">快取鍵</param> /// <param name="data">快取值</param> public static void Insert<T>(string key, T data) { if (string.IsNullOrWhiteSpace(key) || data == null) return; //lock (cacheLocker) { cache.Insert<T>(key, data); } } /// <summary> /// 將指定鍵的物件新增到快取中,並指定過期時間 /// </summary> /// <param name="key">快取鍵</param> /// <param name="data">快取值</param> /// <param name="cacheTime">快取過期時間(分鐘)</param> public static void Insert(string key, object data, int cacheTime) { if (!string.IsNullOrWhiteSpace(key) && data != null) { //lock (cacheLocker) { cache.Insert(key, data, cacheTime); } } } /// <summary> /// 將指定鍵的物件新增到快取中,並指定過期時間 /// </summary> /// <param name="key">快取鍵</param> /// <param name="data">快取值</param> /// <param name="cacheTime">快取過期時間(分鐘)</param> public static void Insert<T>(string key, T data, int cacheTime) { if (!string.IsNullOrWhiteSpace(key) && data != null) { //lock (cacheLocker) { cache.Insert<T>(key, data, cacheTime); } } } /// <summary> /// 將指定鍵的物件新增到快取中,並指定過期時間 /// </summary> /// <param name="key">快取鍵</param> /// <param name="data">快取值</param> /// <param name="cacheTime">快取過期時間</param> public static void Insert(string key, object data, DateTime cacheTime) { if (!string.IsNullOrWhiteSpace(key) && data != null) { //lock (cacheLocker) { cache.Insert(key, data, cacheTime); } } } /// <summary> /// 將指定鍵的物件新增到快取中,並指定過期時間 /// </summary> /// <param name="key">快取鍵</param> /// <param name="data">快取值</param> /// <param name="cacheTime">快取過期時間</param> public static void Insert<T>(string key, T data, DateTime cacheTime) { if (!string.IsNullOrWhiteSpace(key) && data != null) { //lock (cacheLocker) { cache.Insert<T>(key, data, cacheTime); } } } /// <summary> /// 從快取中移除指定鍵的快取值 /// </summary> /// <param name="key">快取鍵</param> public static void Remove(string key) { if (string.IsNullOrWhiteSpace(key)) return; lock (cacheLocker) { cache.Remove(key); } } /// <summary> /// 判斷key是否存在 /// </summary> public static bool Exists(string key) { return cache.Exists(key); } } }