1. 程式人生 > >SCPPO(十六):C#中Redis封裝的類

SCPPO(十六):C#中Redis封裝的類

【前言】

【封裝類介紹】

     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、建立客戶端快取加密碼的是我自己封裝的哈。