• c# 操作Redis的五种基本类型总结


    引言

    在我们的大多数项目中,通常会把数据存储到关系型数据库中,比如Oracle,SQL Server,Mysql等,但是关系型数据库对于并发的支持并不是很强大,这样就会造成系统的性能不佳,

    而且存储的数据多为结构化数据,对于非结构数据(比如文本)和半结构化数据(比如JSon) 就显得不够灵活,而非关系型数据库则很好的弥补了这两点,  我们通常把读操作频繁

    的数据写入Redis中,以Key-value的方式存储来提高性能。Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

    以下介绍了.net中操作redis五种数据类型的基本语法。

    一、String(字符串)

    1. 简介

    string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

    string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

    string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

    2.使用场景

    存储简单的键值对,比如我们需要统计某个网站的点击量,关注量、粉丝量等

    3. C#使用操作举例

     现在需要保存一个Webservice接口的参数,让其实现可配置,比如地址、用户名、密码、同步时间等信息,我们可以将它在前端页面格式化为JSon字符串,

    然后通过Ajax传递到服务端保存到Redis中,代码如下:

     1         /// <summary>
     2         /// 保存数据到Redis缓存中
     3         /// GHB BY 2020-06-26
     4         /// </summary>
     5         /// <param name="KeyName">需要保存的键名称,默认保存到redis的第二个数据库中</param>
     6         /// <param name="configInfo">需要保存的配置信息</param>
     7         /// <returns>返回保存的结果</returns>
     8         public string SaveConfigInfoToRedis(string KeyName,  string configInfo)
     9         {
    10             using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1))
    11             {
    12                 if (client == null) return "保存失败!";
    13                 if (client.ContainsKey(KeyName))
    14                     client.Replace<string>(KeyName, configInfo);
    15                 else
    16                     client.Set<string>(KeyName, configInfo);
    17                 return "保存成功!";
    18             }
    19         }

    保存成功后,我们在redis可视化工具中可以看到我们保存的信息为:

    如果下次加载数据的时候,我们可以根据Key来读取这个string字符串,然后格式化为Hashtable,再序列化为JOSN格式返回到前端,就可以以表单的形式展示,

    在表单中可以修改保存等操作,实现了参数的可配置,这读取代码如下:

     1         /// <summary>
     2         /// 从redis缓存中获取数据,转化为相应格式后返回
     3         /// GHB BY 2020-06-26
     4         /// </summary>
     5         /// <param name="KeyName">缓存中的键名称</param>
     6         /// <returns>输入键对应的值信息</returns>
     7         public string LoadConfigFromRedis(string KeyName)
     8         {
     9             using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1))
    10             {
    11                 if (client == null) return string.Empty;
    12                 string configData = client.Get<string>(KeyName);
    13                 if (string.IsNullOrWhiteSpace(configData))
    14                     return string.Empty;
    15                 Hashtable data = JsonConvert.DeserializeObject<Hashtable>(configData);
    16                 return JsonConvert.SerializeObject(data);
    17 
    18             }
    19         }

    二、hash(哈希)

    1.简介

    Redis hash 是一个键值(key=>value)对集合。

    Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

    2.使用场景

    我们需要灵活的保存一些信息,特别适合保存对象的信息,比如用户信息、配置信息等

    3.C#使用操作举例

    由于我们上面使用string类型的对象保存配置信息存在这样的问题,就是涉及到序列化和反序列化,如果信息量大的话将降低系统性能,

    那么此处我们可以使用Hash数据结构来保存上面的信息,代码如下:

     1         /// <summary>
     2         /// 操作redis的hashtable类型
     3         /// GHB BY 2020-06-26
     4         /// </summary>
     5         public static void OperateHash()
     6         {
     7             using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb",1))
     8             {
     9                 Dictionary<string, string> configDic = new Dictionary<string, string>();
    10                 configDic.Add("config_IP", "localhost");
    11                 configDic.Add("config_Port", "1521");
    12                 configDic.Add("config_serviceName", "orcl");
    13                 configDic.Add("config_userName", "DE_POWERPMS");
    14                 configDic.Add("config_password", "cppepass");
    15                 client.SetRangeInHash("config_info", configDic);
    16                 Dictionary<string, string> testHash = client.GetAllEntriesFromHash("config_info");
    17                 foreach (var item in testHash)
    18                 {
    19                     Console.WriteLine("Hash的key为:{0} 值为:{1}", item.Key, item.Value);
    20                 }
    21                 Console.ReadLine();
    22             }
    23         }

    使用redis可视化工具我们可以刚才存储的数据如下:

    三、List(列表)

    1.简介

    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),可以使用list的push操作将任务存到List,

    然后使用pop操作将任务取出执行,在列表头部或者末尾操作数据非常高效,不受队列长度的影响。

    列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

    2.使用场景

    redis 的 list 数据类型对于大部分使用者来说,是实现队列服务的最经济,最简单的方式。

    另外,因为 list 结构的数据查询两端附近的数据性能非常好,所以适合一些需要获取最新数据的场景,比如新闻类应用的 “最近新闻”,获取钱N个用户列表等。

    3.C#使用操作举例

    对于队列的使用,在此处比如有多个客户端需要打印机打印任务,那么使用队列进行任务的排队,然后按照排队顺序开始打印

    对于栈的使用,比如二叉树的遍历,括号的匹配等,我们可以进行先进后出的顺序完成,代码如下:

     1         /// <summary>
     2         /// 操作redis的List类型
     3         /// GHB BY 2020-06-26
     4         /// </summary>
     5         public static void OperateList()
     6         {
     7             using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1))
     8             {
     9                 #region List队列操作
    10                 client.EnqueueItemOnList("QueueList", "打印任务1");  //入队
    11                 client.EnqueueItemOnList("QueueList", "打印任务2");
    12                 client.EnqueueItemOnList("QueueList", "打印任务3");
    13                 client.EnqueueItemOnList("QueueList", "打印任务4");
    14                 long q = client.GetListCount("QueueList");
    15                 Console.WriteLine("打印任务按照顺序打印开始");
    16                 for (int i = 0; i < q; i++)
    17                 {
    18                     Console.WriteLine("QueueList出队值:{0}", client.DequeueItemFromList("QueueList"));
    19                 }
    20                 Console.WriteLine("打印任务按照顺序打印完成");
    21                 #endregion 
    22                 #region 栈操作
    23                 client.PushItemToList("StackList", "入栈操作1");  //入栈
    24                 client.PushItemToList("StackList", "入栈操作2");
    25                 client.PushItemToList("StackList", "入栈操作3");
    26                 client.PushItemToList("StackList", "入栈操作4");
    27                 Console.WriteLine("开始出栈");
    28                 long p = client.GetListCount("StackList");
    29                 for (int i = 0; i < p; i++)
    30                 {            
    31                     Console.WriteLine("StackList出栈值:{0}", client.PopItemFromList("StackList"));
    32                 }
    33                 Console.WriteLine("出栈完成");
    34                 Console.ReadLine();
    35                 #endregion
    36             }
    37         }

    运行结果显示,队列是先进先出操作,栈是先进后出操作,并且操作完成后,数据被删除,如图所示: 

     四.Set(集合)

    1.简介

    Redis 的 Set 是 string 类型的无序集合。

    集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

    集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

    Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

    2.使用场景

    集合主要应用在一些需要求交集、并集、补集这样的场景,比如我们需要求共同好友、共同兴趣爱好、共同关注的微博,限制同一个账号多处登录系统等场景。 

    3.C#使用操作举例

    比如现在随便举例两个QQ用户为例:QQ用户1和QQ用户2,他们分别有各自的好友,现在我们可以通过集合来获取到他们的共同好友,代码如下:

     1         /// <summary>
     2         /// 操作redis的Set类型
     3         /// GHB BY 2020-06-26
     4         /// </summary>
     5         public static void OperateSet()
     6         {
     7             using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1))
     8             {
     9                 #region Set操作
    10                 client.AddItemToSet("QQ用户1", "好友A");
    11                 client.AddItemToSet("QQ用户1", "好友B");
    12                 client.AddItemToSet("QQ用户1", "好友C");
    13                 client.AddItemToSet("QQ用户1", "好友D");
    14 
    15                 client.AddItemToSet("QQ用户2", "好友C");
    16                 client.AddItemToSet("QQ用户2", "好友F");
    17                 client.AddItemToSet("QQ用户2", "好友G");
    18                 client.AddItemToSet("QQ用户2", "好友D");
    19                 var setunion = client.GetIntersectFromSets("QQ用户1", "QQ用户2");
    20                 Console.WriteLine("QQ用户1和QQ用户2的共同好友为:");
    21                 foreach (var item in setunion)
    22                 {
    23                     Console.WriteLine(item);
    24                 }
    25                 Console.ReadLine();
    26                 #endregion
    27             }
    28         }

    运行结果显示他们的共同好友为: 好友C和好友D

     五、zset(sorted set:有序集合)

    1.简介

    在 set 的基础上给集合中每个元素关联了一个分数,往有序集合中插入数据时会自动根据这个分数排序。不同的是每个元素都会关联一个double类型的分数。

    redis正是通过分数来为集合中的成员进行从小到大的排序。

    zset的成员是唯一的,但分数(score)却可以重复。

    2.使用场景

    在集合类型的场景上加入排序就是有序集合的应用场景了。比如根据好友的“亲密度”排序显示好友列表。

    3.C#使用操作举例

    比如现在有很多主播,每个主播都有粉丝给的礼物,现在需要我们给出礼物数量最多的前三名主播,那么可以使用SortedSet来实现,

    可以分别给每个主播定义个分数来存储礼物数量,代码如下:

     1         /// <summary>
     2         /// 操作redis的SortedSet类型
     3         /// GHB BY 2020-06-26
     4         /// </summary>
     5         public static void OperateSortedSet()
     6         {
     7             using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1))
     8             {
     9                 #region Set操作
    10                 client.AddItemToSortedSet("GiftSortedSet", "主播1", 24);
    11                 client.AddItemToSortedSet("GiftSortedSet", "主播2", 564);
    12                 client.AddItemToSortedSet("GiftSortedSet", "主播3", 746);
    13                 client.AddItemToSortedSet("GiftSortedSet", "主播4", 2357);
    14                 client.IncrementItemInSortedSet("GiftSortedSet", "主播2", new Random().Next(200, 500));
    15                 Console.WriteLine("礼物数最多的前三名主播为:");
    16                 foreach (var item in client.GetRangeWithScoresFromSortedSet("GiftSortedSet",1,3))
    17                 {
    18                     Console.WriteLine($"名:{item.Key} 分数:{item.Value}");
    19                 }
    20                 Console.ReadLine();
    21                 #endregion
    22             }
    23         }

    运行之后,我们可以看到礼物数前三名的主播了,运行结果如下:

    总结

    以上就是.NET环境下操作Redis五种数据类型的所有方法总结,我们可以看到Redis更是一款数据结构服务器,对于这五种数据类型,我们可以实现很多操作,

    比如对字符串进行附加操作;递增哈希中的值;向列表中增加元素;计算集合的交集、并集与差集;使用排序集合来获取排名等。

    好了,今天的技术分享就到这儿了,如果大家有兴趣,可以共同探讨,感谢大家的阅读。

    微信名片 作者 高红斌
    联系QQ 2358643757
    出处 https://www.cnblogs.com/gaohongbin
    本文版权归作者和博客园共有,如需全部转载或者部分转载、摘录,请在文章明显位置注明作者和原文链接。
  • 相关阅读:
    Linux下Socket编程之地址结构
    矫正Fedora 8中livna源Nvidia驱动托付关连
    Firefox3 RC1颁布各种新特征发扬阐发更平定
    Fedora 8中完全开启compizfusion特效
    编译安置gsopcast SVN版
    Sopcast for linux更新至3.01!
    措置惩罚Fedora 8中的装备权限标题成绩
    vsftp假造用户设置(Ubuntu8.04)
    QQ2008贺岁版 on FedoraBy wine 0.9.58
    vFU NET
  • 原文地址:https://www.cnblogs.com/gaohongbin/p/13246498.html
Copyright © 2020-2023  润新知