首先,不得不说Redis官方提供了众多的API开发包,可是目前Redis官方版本不支持.Net直接进行链接,须要使用一些第三方的开源类库。目前最流行的就是ServiceStack.Redis这个开源项目,其在GitHub上的下载地址为:https://github.com/ServiceStack/ServiceStack.Redishtml
进入下载页面,点击“Download Zip”按钮,便可下载该API包。解压该Zip包后,其实咱们所用到的只是其中的几个DLL而已,打开build/release/MonoDevelop文件夹,看到里边还有一个zip包,这里边就是咱们所需的DLL了。git
再次解压这个Zip包,能够看到其中包含以下图所示的DLL文件,这几个也是咱们今天所要引入VS的DLL库,有了它们,咱们就能够在程序端和Redis服务端进行对话了,是否是很赞?github
这时,咱们就能够在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的对象实例,经过这个实例所带的方法和服务端通讯。安全
using System; using System.Collections.Generic; using ServiceStack.Redis; namespace RedisDemo.FirstStart { class Program { //Redis服务器IP地址 static string localHostIP = "127.0.0.1"; //Redis服务端口号 static int redisServicePort = 6379; static void Main(string[] args) { var redisClient = new RedisClient(localHostIP, redisServicePort); Console.ReadKey(); } } }
String是最经常使用的一种数据类型,普通的key/value存储均可以归为此类 。一个Key对应一个Value,string类型是二进制安全的。Redis的string能够包含任何数据,好比jpg图片(生成二进制)或者序列化的对象。服务器
在Redis中的基本操做以下所示:数据结构
static void StringTypeDemo(RedisClient redisClient) { //向Redis中添加一个Key/Value对 redisClient.Set<string>("username", "edisonchou"); //从Redis中读取一个Value值 string userName = redisClient.Get<string>("username"); Console.WriteLine("The value from Redis is {0}", userName); }
运行效果以下:并发
static void HashTypeDemo(RedisClient redisClient) { redisClient.SetEntryInHash("user", "userinfo", "cool boy"); redisClient.SetEntryInHash("user", "useraccount", "5000"); List<string> keyList = redisClient.GetHashKeys("user"); foreach (string key in keyList) { Console.WriteLine(key); string value = redisClient.GetValueFromHash("user", key); Console.WriteLine("user:{0}:{1}", key, value); } }
Lst是一个链表结构,主要功能是push与pop,获取一个范围的全部的值等,操做中key理解为链表名字。 Redis的List类型其实就是一个每一个子元素都是string类型的双向链表,咱们能够经过push或pop操做从链表的头部或者尾部添加删除元素,这样List既能够做为栈,又能够做为队列。它便可以支持反向查找和遍历,更方便操做,不过带来了部分额外的内存开销。Redis内部的不少实现,包括发送缓冲队列等也都是用的这个数据结构。ssh
(1)如今咱们首先来看看List做为(Stack)栈类型的使用: ui
那么在VS中如何来Code呢?经过Push与Pop操做Stack
static void StackTypeDemo(RedisClient redisClient) { redisClient.PushItemToList("userenname", "edisonchou"); redisClient.PushItemToList("userenname", "wncudchou"); redisClient.PushItemToList("userenname", "milkye"); redisClient.PushItemToList("userenname", "dickgu"); int length = redisClient.GetListCount("userenname"); for (int i = 0; i < length; i++) { Console.WriteLine(redisClient.PopItemFromList("userenname")); } }
运行效果以下:
(2)下面咱们来看看List做为(Queue)队列的使用:
那么在VS中如何Code呢?经过DeQueue和EnQueue操做Queue
static void QueueTypeDemo(RedisClient redisClient) { redisClient.EnqueueItemOnList("account", "马云"); redisClient.EnqueueItemOnList("account", "马化腾"); redisClient.EnqueueItemOnList("account", "李彦宏"); int length = redisClient.GetListCount("account"); for (int i = 0; i < length; i++) { Console.WriteLine(redisClient.DequeueItemFromList("account")); } }
运行效果以下:
Set是string类型的无序集合。set是经过hash table实现的,添加,删除和查找,对集合咱们能够取并集,交集,差集,能够很是方便的实现如共同关注、共同喜爱、二度好友等功能,对上面的全部集合操做,你还可使用不一样的命令选择将结果返回给客户端仍是存集到一个新的集合中。
与List比较而言,set对外提供的功能与list相似是一个列表的功能,特殊之处在于set是能够自动排重的,当你须要存储一个列表数据,又不但愿出现重复数据时,set是一个很好的选择,而且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
那么在VS中咱们使用Set来Code一下,先增长两个Set集合,而后对其进行交集、并集与差集运算:
static void SetTypeDemo(RedisClient redisClient) { redisClient.AddItemToSet("a3", "ddd"); redisClient.AddItemToSet("a3", "ccc"); redisClient.AddItemToSet("a3", "tttt"); redisClient.AddItemToSet("a3", "sssh"); redisClient.AddItemToSet("a3", "hhhh"); redisClient.AddItemToSet("a4", "hhhh"); redisClient.AddItemToSet("a4", "h777"); Console.WriteLine("-------------求a3集合------------"); HashSet<string> hashSet = redisClient.GetAllItemsFromSet("a3"); foreach (string value in hashSet) { Console.WriteLine(value); } Console.WriteLine("-------------求并集------------"); hashSet.Clear(); hashSet = redisClient.GetUnionFromSets(new string[] { "a3", "a4" }); foreach (string value in hashSet) { Console.WriteLine(value); } Console.WriteLine("-------------求交集------------"); hashSet.Clear(); hashSet = redisClient.GetIntersectFromSets(new string[] { "a3", "a4" }); foreach (string value in hashSet) { Console.WriteLine(value); } Console.WriteLine("-------------求差集------------"); hashSet.Clear(); hashSet = redisClient.GetDifferencesFromSet("a3", new string[] { "a4" }); foreach (string value in hashSet) { Console.WriteLine(value); } }
运行效果以下:
static void SortedSetTypeDemo(RedisClient redisClient) { redisClient.AddItemToSortedSet("a5", "ffff"); redisClient.AddItemToSortedSet("a5", "bbbb"); redisClient.AddItemToSortedSet("a5", "gggg"); redisClient.AddItemToSortedSet("a5", "cccc"); redisClient.AddItemToSortedSet("a5", "waaa"); List<string> list = redisClient.GetAllItemsFromSortedSet("a5"); foreach (string str in list) { Console.WriteLine(str); } }
运行效果以下:
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