在我们的项目中,通常会把数据存储到关系型数据库中,比如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", , "qd*jy*17ghb", ))
  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", , "qd*jy*17ghb", ))
  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#使用操作举例

我们现在还是以上面保存接口参数为例,将配置信息保存到Hashtable中,代码如下:

  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", , "qd*jy*17ghb",))
  8. {
  9. Dictionary<string, string> configDic = new Dictionary<string, string>();
  10. configDic.Add("config_IP", "localhost");
  11. configDic.Add("config_Port", "");
  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", , "qd*jy*17ghb", ))
  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 = ; 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 = ; 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", , "qd*jy*17ghb", ))
  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", , "qd*jy*17ghb", ))
  8. {
  9. #region Set操作
  10. client.AddItemToSortedSet("GiftSortedSet", "主播1", );
  11. client.AddItemToSortedSet("GiftSortedSet", "主播2", );
  12. client.AddItemToSortedSet("GiftSortedSet", "主播3", );
  13. client.AddItemToSortedSet("GiftSortedSet", "主播4", );
  14. client.IncrementItemInSortedSet("GiftSortedSet", "主播2", new Random().Next(, ));
  15. Console.WriteLine("礼物数最多的前三名主播为:");
  16. foreach (var item in client.GetRangeWithScoresFromSortedSet("GiftSortedSet",,))
  17. {
  18. Console.WriteLine($"名:{item.Key} 分数:{item.Value}");
  19. }
  20. Console.ReadLine();
  21. #endregion
  22. }
  23. }

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

好了,今天的技术分享就到这儿了,如果大家有兴趣,可以共同探讨,QQ:2358643757

c# 操作Redis的五种基本类型总结的更多相关文章

  1. Jedis操作笔记 redis的五种存储类型

    常用数据类型简介: redis常用五种数据类型:string,hash,list,set,zset(sorted set). 1.String类型 String是最简单的类型,一个key对应一个val ...

  2. redis的五种存储类型的具体用法

    String 类型操作 string是redis最基本的类型,而且string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 $redis-> ...

  3. 最全的Java操作Redis的工具类,使用StringRedisTemplate实现,封装了对Redis五种基本类型的各种操作!

    转载自:https://github.com/whvcse/RedisUtil 代码 ProtoStuffSerializerUtil.java import java.io.ByteArrayInp ...

  4. redis的五种基本数据类型

    redis基本数据类型 redis一共分为5中基本数据类型:String,Hash,List,Set,ZSet 第一种String String类型是包含很多种类型的特殊类型,并且是二进制安全的.比如 ...

  5. spring aop 的五种通知类型

    本文转自:http://blog.csdn.net/cqabl/article/details/46965197 spring aop通知(advice)分成五类: 前置通知[Before advic ...

  6. 学习ActiveMQ(五):activemq的五种消息类型和三种监听器类型

    一.前面我们一直发送的是字符串类型,其实activemq一共支持五种消息类型: 1.String消息类型:发送者:消费者: 1.String消息类型:发送者:消费者: 1.String消息类型:发送者 ...

  7. python操作Redis安装、支持存储类型、普通连接、连接池

    一.python操作redis安装和支持存储类型 安装redis模块 pip3 install redis 二.Python操作Redis之普通连接 redis-py提供两个类Redis和Strict ...

  8. Redis入门到高可用(四)—— Redis的五种数据结构的内部编码

    Redis的五种数据结构的内部编码

  9. jedis操作redis的几种常见方式总结

    Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种,这篇文章主要给大家总结了关于在java中jedis操作redis的几种常见方式,文中给出了详细的示例代码供大家参考学习 ...

随机推荐

  1. Java实现 LeetCode 19删除链表的倒数第N个节点

    19. 删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当 ...

  2. java算法集训结果填空题练习2

    1 欧拉与鸡蛋 大数学家欧拉在集市上遇到了本村的两个农妇,每人跨着个空篮子.她们和欧拉打招呼说两人刚刚卖完了所有的鸡蛋. 欧拉随便问:"卖了多少鸡蛋呢?" 不料一个说:" ...

  3. java实现第七届蓝桥杯骰子游戏

    骰子游戏 PS: 骰子哪有从0开始的只能是1-6,而他i j k的范围都是0-5,所以都要加1 题目描述 我们来玩一个游戏. 同时掷出3个普通骰子(6个面上的数字分别是1~6). 如果其中一个骰子上的 ...

  4. Linux文件搜索命令find

    命令find可以根据文件的不同属性在指定的范围内搜索文件,例如: 根据文件名进行查找,在目录/etc下搜索文件名为init( -iname 可以实现不区分大小写进行查找)的文件,实现精准查找,只查找文 ...

  5. 曹工说JDK源码(2)--ConcurrentHashMap的多线程扩容,说白了,就是分段取任务

    前言 先预先说明,我这边jdk的代码版本为1.8.0_11,同时,因为我直接在本地jdk源码上进行了部分修改.调试,所以,导致大家看到的我这边贴的代码,和大家的不太一样. 不过,我对源码进行修改.重构 ...

  6. Linux系统调用和ANSI C文件操作的区别

    一.在Linux下对文件操作有两种方式:Linux系统调用和ANSI C文件操作. 1.Linux系统调用调用常用于I/O文件操作,系统调用常用的函数有open.close.read.write.ls ...

  7. 记 Centos zabbix-agent启动失败解决思路

    一. 环境介绍 系统版本:Centos7.4 zabbix-agent 版本:zabbix-agent 3.4.7 二. 问题现象 启动zabbix-agent时启动失败 查看zabbix-agent ...

  8. java Exception 处理汇总

    1.java.lang.Exception: No runnable methods 测试类,没有可以运行的方法 解决: 方法添加注释:@Test

  9. 如何在centos7安装dnf软件包

    想在自己的笔记本CentOS7上安装dnf玩玩儿,但是根据百度出来的方法没有成功. yum install epel-release -y yum install dnf 现在将解决办法转载过来,如下 ...

  10. Spring boot添加配置类@Configuration并初始化@Bean,@Resource和@Autowired都为null

    大写加黑,找了好久@Resource和@Autowired都依赖不到创建的bean的原因:@Bean的方法名即是创建的Bean名称 import org.activiti.engine.Process ...