Redis API与常用数据类型简介

一、Redis API For .Net

  首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库。目前最流行的就是ServiceStack.Redis这个开源项目,其在GitHub上的下载地址为:https://github.com/ServiceStack/ServiceStack.Redis

  进入下载页面,点击“Download Zip”按钮,即可下载该API包。解压该Zip包后,其实我们所用到的只是其中的几个DLL而已,打开build/release/MonoDevelop文件夹,看到里边还有一个zip包,这里边就是我们所需的DLL了。

  再次解压这个Zip包,可以看到其中包含如下图所示的DLL文件,这几个也是我们今天所要引入VS的DLL库,有了它们,我们就可以在程序端和Redis服务端进行对话了,是不是很赞?

  这时,我们就可以在VS中新建一个控制台项目,命名为RedisDemo,然后新建一个Lib文件夹用来存放我们的DLL文件,然后添加对这些DLL引用。至此,就是万事俱备只欠东风了,我们接下来会在程序中调用Redis客户端和Redis服务端进行通信,了解Redis API为我们提供的丰富的数据类型。

二、Redis中常用数据类型

  由上一篇博客可知,Redis目前提供五种数据类型:string(字符串)、list(链表)、Hash(哈希)、set(集合)及zset(sorted set)  (有序集合)。现在,我们一一来看看这五种数据类型的基本使用方法。在开始介绍之前,我们先使用刚刚引入的Redis API建立一个Redis客户端对象,有了这个客户端对象,我们才能和Redis服务端进行通信,且看下面的一行代码。我们需要事先指定好Redis服务端的IP地址和端口号,然后根据这两个信息建立一个RedisClient的对象实例,通过这个实例所带的方法和服务端通信。

  1. using System;
  2. using System.Collections.Generic;
  3. using ServiceStack.Redis;
  4.  
  5. namespace RedisDemo.FirstStart
  6. {
  7. class Program
  8. {
  9. //Redis服务器IP地址
  10. static string localHostIP = "127.0.0.1";
  11. //Redis服务端口号
  12. static int redisServicePort = 6379;
  13.  
  14. static void Main(string[] args)
  15. {
  16. var redisClient = new RedisClient(localHostIP, redisServicePort);
  17.  
  18. Console.ReadKey();
  19. }
  20. }
  21. }

  2.1 String 字符串

  String是最常用的一种数据类型,普通的key/value存储都可以归为此类 。一个Key对应一个Value,string类型是二进制安全的。Redis的string可以包含任何数据,比如jpg图片(生成二进制)或者序列化的对象。

  在Redis中的基本操作如下所示:

  1.      static void StringTypeDemo(RedisClient redisClient)
  2. {
  3. //向Redis中添加一个Key/Value对
  4. redisClient.Set<string>("username", "edisonchou");
  5. //从Redis中读取一个Value值
  6. string userName = redisClient.Get<string>("username");
  7.  
  8. Console.WriteLine("The value from Redis is {0}", userName);
  9. }

  运行效果如下:

  2.2 Hash 哈希

  Hash是一个string 类型的field和value的映射表。Hash特别适合存储对象,相对于将对象的每个字段存成单个string 类型。一个对象存储在Hash类型中会占用更少的内存,并且可以更方便的存取整个对象。
  这里借用群叔的描述,我们简单举个实例来描述下Hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:
  第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。
  第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的
  因此,基于以上两种方式的缺陷,Redis提供的Hash很好的解决了这个问题,Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口,如下图:
  也就是说,Key仍然是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题,也就很好的解决了问题。
  下面我们在VS中来看看Hash类型如何Code:
  1. static void HashTypeDemo(RedisClient redisClient)
  2. {
  3. redisClient.SetEntryInHash("user", "userinfo", "cool boy");
  4. redisClient.SetEntryInHash("user", "useraccount", "5000");
  5.  
  6. List<string> keyList = redisClient.GetHashKeys("user");
  7.  
  8. foreach (string key in keyList)
  9. {
  10. Console.WriteLine(key);
  11. string value = redisClient.GetValueFromHash("user", key);
  12. Console.WriteLine("user:{0}:{1}", key, value);
  13. }
  14. }
  运行结果如下图:

  2.3 List 链表

  Lst是一个链表结构,主要功能是push与pop,获取一个范围的所有的值等,操作中key理解为链表名字。 Redis的List类型其实就是一个每个子元素都是string类型的双向链表,我们可以通过push或pop操作从链表的头部或者尾部添加删除元素,这样List既可以作为栈,又可以作为队列。它即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

  (1)现在我们首先来看看List作为(Stack)栈类型的使用: 

  那么在VS中如何来Code呢?通过Push与Pop操作Stack

  1. static void StackTypeDemo(RedisClient redisClient)
  2. {
  3. redisClient.PushItemToList("userenname", "edisonchou");
  4. redisClient.PushItemToList("userenname", "wncudchou");
  5. redisClient.PushItemToList("userenname", "milkye");
  6. redisClient.PushItemToList("userenname", "dickgu");
  7.  
  8. int length = redisClient.GetListCount("userenname");
  9. for (int i = 0; i < length; i++)
  10. {
  11. Console.WriteLine(redisClient.PopItemFromList("userenname"));
  12. }
  13. }

  运行效果如下:

  (2)下面我们来看看List作为(Queue)队列的使用:

  那么在VS中如何Code呢?通过DeQueue和EnQueue操作Queue

  1. static void QueueTypeDemo(RedisClient redisClient)
  2. {
  3. redisClient.EnqueueItemOnList("account", "马云");
  4. redisClient.EnqueueItemOnList("account", "马化腾");
  5. redisClient.EnqueueItemOnList("account", "李彦宏");
  6.  
  7. int length = redisClient.GetListCount("account");
  8. for (int i = 0; i < length; i++)
  9. {
  10. Console.WriteLine(redisClient.DequeueItemFromList("account"));
  11. }
  12. }

  运行效果如下:

  2.4 Set 集合

  Set是string类型的无序集合。set是通过hash table实现的,添加,删除和查找,对集合我们可以取并集,交集,差集,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

  与List比较而言,set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

  那么在VS中我们使用Set来Code一下,先增加两个Set集合,然后对其进行交集、并集与差集运算:

  1.     static void SetTypeDemo(RedisClient redisClient)
  2. {
  3. redisClient.AddItemToSet("a3", "ddd");
  4. redisClient.AddItemToSet("a3", "ccc");
  5. redisClient.AddItemToSet("a3", "tttt");
  6. redisClient.AddItemToSet("a3", "sssh");
  7. redisClient.AddItemToSet("a3", "hhhh");
  8. redisClient.AddItemToSet("a4", "hhhh");
  9. redisClient.AddItemToSet("a4", "h777");
  10.  
  11. Console.WriteLine("-------------求a3集合------------");
  12.  
  13. HashSet<string> hashSet = redisClient.GetAllItemsFromSet("a3");
  14. foreach (string value in hashSet)
  15. {
  16. Console.WriteLine(value);
  17. }
  18.  
  19. Console.WriteLine("-------------求并集------------");
  20.  
  21. hashSet.Clear();
  22. hashSet = redisClient.GetUnionFromSets(new string[] { "a3", "a4" });
  23. foreach (string value in hashSet)
  24. {
  25. Console.WriteLine(value);
  26. }
  27.  
  28. Console.WriteLine("-------------求交集------------");
  29.  
  30. hashSet.Clear();
  31. hashSet = redisClient.GetIntersectFromSets(new string[] { "a3", "a4" });
  32. foreach (string value in hashSet)
  33. {
  34. Console.WriteLine(value);
  35. }
  36.  
  37. Console.WriteLine("-------------求差集------------");
  38.  
  39. hashSet.Clear();
  40. hashSet = redisClient.GetDifferencesFromSet("a3", new string[] { "a4" });
  41. foreach (string value in hashSet)
  42. {
  43. Console.WriteLine(value);
  44. }
  45. }

  运行效果如下:

  2.5 Sorted Set 有序集合

  Sorted Set 是set的一个升级版本,又被称为ZSet,它在set的基础上增加了一个顺序的属性,这一属性在添加修改。元素的时候可以指定,每次指定后,zset(表示有序集合)会自动重新按新的值调整顺序。可以理解为有列的表,一列存 value,一列存顺序。操作中key理解为zset的名字。
  sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构。此外,还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
  下面,我们在VS中编写对Sorted Set的操作代码,输出时会按字母的有序顺序输出:
  1. static void SortedSetTypeDemo(RedisClient redisClient)
  2. {
  3. redisClient.AddItemToSortedSet("a5", "ffff");
  4. redisClient.AddItemToSortedSet("a5", "bbbb");
  5. redisClient.AddItemToSortedSet("a5", "gggg");
  6. redisClient.AddItemToSortedSet("a5", "cccc");
  7. redisClient.AddItemToSortedSet("a5", "waaa");
  8.  
  9. List<string> list = redisClient.GetAllItemsFromSortedSet("a5");
  10. foreach (string str in list)
  11. {
  12. Console.WriteLine(str);
  13. }
  14. }

  运行效果如下:

三、小结

  Redis为我们提供了相比Memcached更为丰富多样的数据类型,使得Redis可以用在多种多样的应用场合,这也说明了为什么Redis在国内外各大互联网名企中这么受欢迎的原因。本篇简单地介绍和使用了各种数据类型,下一篇,我们会针对1-2个具体应用场景来使用这些数据类型进行具体案例的Code。最后,还是谢谢参考资料的原作者,站在你们的肩膀上,我们才能看的更远!

参考文献

(1)传智播客公开课,王承伟主讲,http://bbs.itcast.cn/thread-26525-1-1.html

(2)群叔,《Redis数据类型详解及Redis适用场景》,http://www.cnblogs.com/qunshu/p/3196972.html

附件下载

(1)ServiceStack.Redis:http://pan.baidu.com/s/1sjtxe5v

Redis API与常用数据类型简介的更多相关文章

  1. NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

    一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...

  2. 【转】NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

    一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...

  3. openresty开发系列12--lua介绍及常用数据类型简介

    openresty开发系列12--lua介绍及常用数据类型简介 lua介绍  1993 年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de ...

  4. Redis服务之常用数据类型

    上一篇博客我们聊了下redis的主从复制.aof持久化.集群.慢日志相关配置指令的说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13416534.html ...

  5. Python常用数据类型简介

    1.变量的三个基本特征 1,大印 2,判断变量值是否相等 3,判断变量id是否相等 2.常用数据类型分类 数字类型(int) 字符串类型(str) 列表类型(list) 字典类型(dict(dicti ...

  6. Redis五种常用数据类型

    string 字符串常用操作 1.存入字符串键值对  SET key value 2.批量存储字符串键值对  MSET key value [key value ...] 3.获取一个字符串键值  G ...

  7. Redis(三)数据类型

    之前的文章中说了Redis的常见应用场景和特性,在特性章节中也大致说了数据结构契合场景.因为我想在更深入.更全面的学习Redis之前,了解场景和特性,才能在学习时更加全面且理解更透彻: redis的什 ...

  8. Redis简介、与memcached比较、存储方式、应用场景、生产经验教训、安全设置、key的建议、安装和常用数据类型介绍、ServiceStack.Redis使用(1)

    1.NOSQL简介 nosql的产生并不是要彻底的代替关系型数据库,而是作为传统关系型数据库的一个补充. Facebook和360使用Cassandra来存储海量社交数据 Twitter在其url抓取 ...

  9. Redis常用数据类型及各种数据类型应用和实现方式

    Redis常用数据类型: StringHashListSetSorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的: 首先Red ...

随机推荐

  1. SharePoint 2010 中创建超链接到Pop-Up对话框

    SharePoint 2010 中创建超链接到Pop-Up对话框         SharePoint 2010 推出了新式的带有阴影的弹出对话框,你感觉怎么样?我感觉倒是挺酷的.这样少打开了一个页面 ...

  2. Android项目外接高德地图代码混淆注意事项

    如今好多项目中都加入了第三方jar包,可是最大的问题就是打包的时候代码混淆报错,下面是高德地图混淆报错解决方式: 在proguard-project.txt中加入例如以下代码: -libraryjar ...

  3. 打造简易可扩展的jQuery/CSS3 Tab菜单

    原文:打造简易可扩展的jQuery/CSS3 Tab菜单 今天我们利用jQuery和CSS3来打造一款简易而且扩展性强的Tab菜单,这款Tab菜单在切换时也有滑块的效果,先来看看效果图: 由与Tab菜 ...

  4. Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用

    原文:Eval().XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用 “/vs2005”应用程序中的服务器错误.--------------------------- ...

  5. ACM 入门计划

    acm 本文由swellspirit贡献 ACM • I can accept failure. but I can't accept not trying. Life is often compar ...

  6. Cocos2d-x实现Android的Toast特征

    1.Toast Android的Toast是View视图,显示少量的信息.主要用于一些提示和帮助.本文实现了Toast最主要的操作能, 代码例如以下: //PacToast.h #include &q ...

  7. No bean named &#39;sessionFactory&#39; is defined

    1.错误叙述性说明 严重:Servlet service() for servlet default threw exception . org.springframework.beans.facto ...

  8. 【设计模式】Abstract Factory模式

    抽象工厂模式是工厂方法模式的进一步强化.当工厂函数仅仅须要产生一种类型的产品(全部产品都继承自同一抽象基类)时,使用工厂方法模式就可以. 可是.当用户程序须要创建多种类型的产品,而这些产品又有一定的内 ...

  9. 泛型方法动态生成表达式树 Expression

    public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> Temp = db.TraderInfo; if ...

  10. Excel 删除所有错误公式

    当前工作表的话可以F5-定位-公式-错误值 来选中所有含错误值的单元格,然后按delete删除. 多表的话没办法了,因为不能跨工作表多重选中,只能一页页的删,或者用vba编个宏来解决