SCPPO(十六):C#中Redis封裝的類
阿新 • • 發佈:2019-01-05
【前言】
【封裝類介紹】
1、在專案中引入Redis相關的DLL:
2、由於很多地方呼叫,所以將一些常用的方法封裝起來並放在公共解決方案中:
(1)RedisManager: 主要是建立連結池管理物件,其中主要包括建立Redis客戶端方法和設定程式連線池兩個方法;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ServiceStack.Redis; using System.Data; using System.Data.OleDb; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PCITC.MES.SCPPO.Common { /// <summary> /// RedisManager類主要是建立連結池管理物件的 /// </summary> public static class RedisManager { /// <summary> /// redis配置檔案資訊 /// </summary> private static string RedisPath = CommonConfigInfo.RedisIP; private static PooledRedisClientManager _prcm; /// <summary> /// 靜態構造方法,初始化連結池管理物件 /// </summary> static RedisManager() { CreateManager(); } /// <summary> /// 建立連結池管理物件 /// </summary> private static void CreateManager() { _prcm = CreateManager(new string[] { RedisPath }, new string[] { RedisPath }); } private static PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts) { //WriteServerList:可寫的Redis連結地址。 //ReadServerList:可讀的Redis連結地址。 //MaxWritePoolSize:最大寫連結數。 //MaxReadPoolSize:最大讀連結數。 //AutoStart:自動重啟。 //LocalCacheTime:本地快取到期時間,單位:秒。 //RecordeLog:是否記錄日誌,該設定僅用於排查redis執行時出現的問題,如redis工作正常,請關閉該項。 //RedisConfigInfo類是記錄redis連線資訊,此資訊和配置檔案中的RedisConfig相呼應 // 支援讀寫分離,均衡負載 return new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig { MaxWritePoolSize = 5, // “寫”連結池連結數 MaxReadPoolSize = 5, // “讀”連結池連結數 AutoStart = true, }); } private static IEnumerable<string> SplitString(string strSource, string split) { return strSource.Split(split.ToArray()); } /// <summary> /// 客戶端快取操作物件 /// </summary> public static IRedisClient GetClient() { if (_prcm == null) { CreateManager(); } return _prcm.GetClient(); } /// <summary> /// 客戶端含有密碼的快取物件 /// </summary> /// <returns></returns> public static IRedisClient GetHavePasClient() { IRedisClient HavePasRedis = RedisManager.GetClient(); HavePasRedis.Password = CommonConfigInfo.RedisPassword; return HavePasRedis; } } }
(2)RedisOperatorBase:Redis操作的基類,主要用於釋放記憶體和儲存Redis檔案到硬碟兩個方法;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ServiceStack.Redis; using System.Data; using System.Data.OleDb; using System.Threading.Tasks; namespace PCITC.MES.SCPPO.Common { /// <summary> /// RedisOperatorBase類,是redis操作的基類,繼承自IDisposable介面,主要用於釋放記憶體 /// </summary> public abstract class RedisOperatorBase : IDisposable { protected IRedisClient Redis { get; private set; } private bool _disposed = false; protected RedisOperatorBase() { Redis = RedisManager.GetClient(); } protected virtual void Dispose(bool disposing) { if (!this._disposed) { if (disposing) { Redis.Dispose(); Redis = null; } } this._disposed = true; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// <summary> /// 儲存資料DB檔案到硬碟 /// </summary> public void Save() { Redis.Save(); } /// <summary> /// 非同步儲存資料DB檔案到硬碟 /// </summary> public void SaveAsync() { Redis.SaveAsync(); } } }
(3)HashOperator:操作雜湊表類,繼承自RedisOperatorBase,主要包括對Hash的增刪改查操作。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ServiceStack.Text; using System.Data; using System.Data.OleDb; using System.Threading.Tasks; namespace PCITC.MES.SCPPO.Common { /// <summary> /// HashOperator類,是操作雜湊表類。繼承自RedisOperatorBase類 /// </summary> public class HashOperator : RedisOperatorBase { public HashOperator() : base() { } /// <summary> /// 判斷某個資料是否已經被快取 /// </summary> public bool Exist<T>(string hashId, string key) { return Redis.HashContainsEntry(hashId, key); } /// <summary> /// 儲存資料到hash表 /// </summary> public bool Set<T>(string hashId, string key, T t) { var value = JsonSerializer.SerializeToString<T>(t); return Redis.SetEntryInHash(hashId, key, value); } /// <summary> /// 移除hash中的某值 /// </summary> public bool Remove(string hashId, string key) { return Redis.RemoveEntryFromHash(hashId, key); } /// <summary> /// 移除整個hash /// </summary> public bool Remove(string key) { return Redis.Remove(key); } /// <summary> /// 從hash表獲取資料 /// </summary> public T Get<T>(string hashId, string key) { string value = Redis.GetValueFromHash(hashId, key); return JsonSerializer.DeserializeFromString<T>(value); } /// <summary> /// 獲取整個hash的資料 /// </summary> public List<T> GetAll<T>(string hashId) { var result = new List<T>(); var list = Redis.GetHashValues(hashId); if (list != null && list.Count > 0) { list.ForEach(x => { var value = JsonSerializer.DeserializeFromString<T>(x); result.Add(value); }); } return result; } /// <summary> /// 設定快取過期 /// </summary> public void SetExpire(string key, DateTime datetime) { Redis.ExpireEntryAt(key, datetime); } } }
【總結】
1、將這些公共的方法封裝起來放到公共的地方,有點封裝的意思,和在對資料庫操作時封裝個SqlHelper有異曲同工之妙哈;
2、現代是個分享的時代,感謝那些將這些東西研究出來並且分享出來的人們,你們是最美的;
3、建立客戶端快取加密碼的是我自己封裝的哈。