C#读写Redis各种数据类型+通过Pipeline管道传输大数据

对C#的不公正待遇表示下强烈的不满
在这里插入图片描述
就没了?就没有C#使用redis??

话不多说,冲!

1:首先自己下载安装一个windows版本的redis,安装后运行服务器。
2:然后在VS2015中,右键项目名称,点击nuget

在这里插入图片描述我这边安装的是这个
在这里插入图片描述

这边自己写了一个封装类

  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;
        }
        
         public static void SetHashByPipe(string hashname, Dictionary<string, string> value)
        {
            var pipeline = client.CreatePipeline();
            pipeline.QueueCommand(r => r.SetRangeInHash(hashname, value));
            pipeline.Flush();
            pipeline.Dispose();
        }

        public static List<string> GetHashByPipe(string hashname, List<string> keys)
        {
            var result = new List<string>();
            var pipeline = client.CreatePipeline();
            foreach (var item in keys)
            {
                pipeline.QueueCommand((r => r.GetValueFromHash(hashname, item)), 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);       

展示管道传输:
在这里插入图片描述
这边准备了53万3千多条数据,准备进行管道传输。让我们来看看它的速度。
在这里插入图片描述
只花了2.4s就插入成功!

接下来我们看看读取
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
可以看到,只花了1.87s就读取成功53万多条数据。

就是这么强大。烦恼!

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yangzm996

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值