天天看點

C#讀寫Redis各種資料類型+通過Pipeline管道傳輸大資料

對C#的不公正待遇表示下強烈的不滿

C#讀寫Redis各種資料類型+通過Pipeline管道傳輸大資料

就沒了?就沒有C#使用redis??

話不多說,沖!

1:首先自己下載下傳安裝一個windows版本的redis,安裝後運作伺服器。

2:然後在VS2015中,右鍵項目名稱,點選nuget

C#讀寫Redis各種資料類型+通過Pipeline管道傳輸大資料

我這邊安裝的是這個

C#讀寫Redis各種資料類型+通過Pipeline管道傳輸大資料

這邊自己寫了一個封裝類

public class RedisHelper
    {
        private bool _disposed = false;
        [DefaultValue("127.0.0.1")]
        private static string _ip = "127.0.0.1";
        [DefaultValue(6379)]
        private static int _port = 6379;
        private static ServiceStack.Redis.RedisClient client = new ServiceStack.Redis.RedisClient(_ip, _port);
        public static string Ip
        {
            get
            {
                return _ip;
            }

            set
            {
                _ip = value;
            }
        }
        public static int Port
        {
            get
            {
                return _port;
            }

            set
            {
                _port = value;
            }
        }
         /// <summary>
        /// 設定字元串類型
        /// </summary>
        /// <param name="keys"></param>
        /// <param name="value"></param>
        public static void SetString(string keys, string value)
        {
            client.Set<string>(keys, value);
        }
        /// <summary>
        /// 擷取字元串類型
        /// </summary>
        /// <param name="keys"></param>
        /// <returns></returns>
        public static string GetString(string keys)
        {
            return client.Get<string>(keys);
        }

        public static bool HasContains(string Hasname, string key)
        {
            return client.HExists(Hasname, Encoding.ASCII.GetBytes(key)) > 0;
        }
        /// <summary>
        /// 設定哈希值
        /// </summary>
        /// <param name="HasName"></param>
        /// <param name="filedname"></param>
        /// <param name="filedvalue"></param>
        public static void SetHas(string HasName, string filedname, string filedvalue)
        {
            byte[] d = Encoding.ASCII.GetBytes(filedname);
            d = Encoding.ASCII.GetBytes(filedvalue);
            client.HSet(HasName, Encoding.ASCII.GetBytes(filedname), Encoding.ASCII.GetBytes(filedvalue));           
        }
        /// <summary>
        /// 設定多個哈希值
        /// </summary>
        /// <param name="HasName"></param>
        /// <param name="filedname"></param>
        /// <param name="filedvalue"></param>
        public static void SetHas(string HasName, string[] filedname, string[] filedvalue)
        {
            byte[][] keys = new byte[filedname.Length][];
            byte[][] values = new byte[filedvalue.Length][];
            for (int j = 0; j < filedname.Length; j++)
            {
                keys[j] = Encoding.ASCII.GetBytes(filedname[j]);
                values[j] = Encoding.ASCII.GetBytes(filedvalue[j] == null ? "" : filedvalue[j]);
            }
            client.HMSet(HasName, keys, values);
        }

        public static string[] GetHasKey(string HasName)
        {
            byte[][] result = client.HKeys(HasName);
            if (result == null)
                return null;
            string[] ReturnValues = new string[result.Length];
            for (int j = 0; j < result.Length; j++)
            {
                ReturnValues[j] = Encoding.ASCII.GetString(result[j]);
            }
            return ReturnValues;
        }
        
        /// <summary>
        /// 擷取哈希值
        /// </summary>
        /// <param name="HasName"></param>
        /// <param name="filedname"></param>
        /// <returns></returns>
        public static string GetHas(string HasName, string filedname)
        {
            byte[] result = client.HGet(HasName, Encoding.ASCII.GetBytes(filedname));
            string s = Encoding.ASCII.GetString(result);
            return result == null ? "" : Encoding.ASCII.GetString(result);
        }
        
        /// <summary>
        /// 擷取哈希值
        /// </summary>
        /// <param name="HasName"></param>
        /// <param name="filedname"></param>
        /// <returns></returns>
        public static string[] GetHas(string HasName, string[] filedname)
        {
            byte[][] parms = new byte[filedname.Length][];
            for (int j = 0; j < filedname.Length; j++)
            {
                parms[j] = Encoding.ASCII.GetBytes(filedname[j]);
            }
            byte[][] values = client.HMGet(HasName, parms);
            string[] ReturnValues = new string[values.Length];
            for (int j = 0; j < values.Length; j++)
            {
                ReturnValues[j] = Encoding.ASCII.GetString(values[j]);
            }
            return ReturnValues;
        }
       
        /// <summary>
        /// 設定Set類型的資料
        /// </summary>
        /// <param name="Setname"></param>
        /// <param name="value"></param>
        public static void SetSet(string Setname, string value) //set集合是  String 類型的無序集合。集合成員是唯一的。
        {
            if (!client.ContainsKey(Setname))
            {
                byte[] data = Encoding.ASCII.GetBytes(value);
                client.SAdd(Setname, data);
               
            }
        }
        /// <summary>
        /// 擷取Set類型的資料
        /// </summary>
        /// <param name="Setname"></param>
        /// <returns></returns>
        public static string[] GetSet(string Setname)
        {
            if (client.ContainsKey(Setname))
            {
                byte[][] data = client.SMembers(Setname);
                string[] ReturnValues = new string[data.Length];
                for (int j = 0; j < data.Length; j++)
                {
                    ReturnValues[j] = Encoding.ASCII.GetString(data[j]);
                }
                return ReturnValues;
            }
            return null;
        }
        /// <summary>
        /// 添加list清單的資料。
        /// </summary>
        /// <param name="ListName"></param>
        /// <param name="value"></param>
        public static void SetList(string ListName, string value)
        {
            byte[] result = Encoding.ASCII.GetBytes(value);
            client.LPush(ListName, result);
        }

        public static string GetList(string ListName)
        {
            //list清單的第一個元素為最後插入的這個元素,後進先出的原則

            //byte[] result = client.LPop(ListName);//移出并擷取清單的第一個元素
            byte[] result = client.RPop(ListName);//移除并擷取清單的最後一個元素

            return Encoding.ASCII.GetString(result);
        }
        /// <summary>
        /// 設定有序集合的值
        /// </summary>
        /// <param name="SortedSetName"></param>
        /// <param name="score"></param>
        /// <param name="value"></param>
        public static void SetSortedSet(string SortedSetName,double score, string value)
        {
            byte[] result = Encoding.ASCII.GetBytes(value);
            client.ZAdd(SortedSetName, score, result);
        }
        //有序集合和集合一樣也是 string 類型元素的集合,且不允許重複的成員
        //不同的是每個元素都會關聯一個 double 類型的分數。redis 正是通過分數來為集合中的成員進行從小到大的排序。
        //有序集合的成員是唯一的,但分數(score)卻可以重複。
        /// <summary>
        /// 擷取有序集合的值
        /// </summary>
        /// <param name="SortedSetName"></param>
        /// <param name="min"></param>
        /// <param name="max"></param>
        /// <returns></returns>
        public static string[]  GetSortedSet(string SortedSetName,int min,int max)
        {
            byte[][] data = client.ZRangeWithScores(SortedSetName, min, max);//同時傳回值和分數
            string[] ReturnValues = new string[data.Length];
            for (int j = 0; j < data.Length; j++)
            {
                ReturnValues[j] = Encoding.ASCII.GetString(data[j]);
            }
            return ReturnValues;
        }
         /// <summary>
        /// 使用管道傳輸資料至redis
        /// </summary>
        /// <param name="keys"></param>
        /// <param name="values"></param>
        public static void SetStringByPipe(List<string> keys, List<string> values)
        {
            var pipeline = client.CreatePipeline();
            for (int j = 0; j < keys.Count; j++)
            {
                pipeline.QueueCommand(r => r.Set(keys[j], values[j]));
            }
            pipeline.Flush();
            pipeline.Dispose();
        }
        /// <summary>
        /// 使用管道傳輸從redis裡面擷取資料
        /// </summary>
        /// <param name="keys"></param>
        /// <returns></returns>
        public static List<string> GetStringByPipe(List<string> keys)
        {
            var result = new List<string>();
            var pipeline = client.CreatePipeline();
            for (int j = 0; j < keys.Count; j++)
            {
                pipeline.QueueCommand((r => r.Get<string>(keys[j])), result.Add);
            }
            pipeline.Flush();
            pipeline.Dispose();
            return result;
        }
         #region redis管理
        /// <summary>
        /// 關閉連接配接
        /// </summary>
        public static void CloseClient()
        {
            client.CloneClient();
            client.Dispose();
        }
        protected virtual void Dispose(bool disposing)
        {
            if (!this._disposed)
            {
                if (disposing)
                {
                    client.Dispose();
                    client = null;
                }
            }
            this._disposed = true;
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        /// <summary>
        /// 儲存資料DB檔案到硬碟
        /// </summary>
        public void Save()
        {
            client.Save();
        }
        /// <summary>
        /// 異步儲存資料DB檔案到硬碟
        /// </summary>
        public void SaveAsync()
        {
            client.SaveAsync();
        }
        #endregion
   }     
           

使用隻要調用寫好的封裝方法即可。

//設定字元串
            RedisHelper.SetString("string", "good");
  //擷取字元串
            string value = RedisHelper.GetString("string");
  //設定哈希值
            RedisHelper.SetHas("hash", "set", "ok");            
//擷取哈希值
            string value= RedisHelper.GetHas("hash", "set");
  //擷取所有的哈希keys
            string[] hashkeys = RedisHelper.GetHasKey("hash");
 //設定list清單
            RedisHelper.SetList("List","Value1");
            RedisHelper.SetList("List", "Value2");
            RedisHelper.SetList("List", "Value3");
 //擷取list清單
            string value = RedisHelper.GetList("List");
  //設定set集合資料
            RedisHelper.SetSet("set","value1");
            RedisHelper.SetSet("set", "value2");
 //擷取set類型集合資料
           string[] value=RedisHelper.GetSet("set");
 //設定有序集合的值
            RedisHelper.SetSortedSet("sortset",1,"aaa");
            RedisHelper.SetSortedSet("sortset", 2, "bbb");
            RedisHelper.SetSortedSet("sortset", 3, "ccc");
     //擷取有序集合的值
            string[] value= RedisHelper.GetSortedSet("sortset", 0,2);       
           

展示管道傳輸:

C#讀寫Redis各種資料類型+通過Pipeline管道傳輸大資料

這邊準備了53萬3千多條資料,準備進行管道傳輸。讓我們來看看它的速度。

C#讀寫Redis各種資料類型+通過Pipeline管道傳輸大資料

隻花了2.4s就插入成功!

接下來我們看看讀取

C#讀寫Redis各種資料類型+通過Pipeline管道傳輸大資料
C#讀寫Redis各種資料類型+通過Pipeline管道傳輸大資料
C#讀寫Redis各種資料類型+通過Pipeline管道傳輸大資料

可以看到,隻花了1.87s就讀取成功53萬多條資料。

就是這麼強大。煩惱!

繼續閱讀