• 1
  • 2
  • 3
  • 4
  • 5
mssql数据库问题 首 页  »  帮助中心  »  数据库  »  mssql数据库问题
Redis的简介与数据类型存储
发布日期:2016-4-22 20:4:33
Redis的简介与数据类型存储

  现在我们在大型互联网项目当中,由于用户访问量比较大,比较多,会产生很多并发问题,那么,对于这个,我们该如何解决呢,Redis横空出世,首先,让我们来简单的认识一下Redis,详细介绍如下:

  Redis简介:

  •      性质:是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据库系统
  •      特点:高性能,持久存储,适应高并发的应用场景。Redis纯粹为应用而产生,她是一个高性能的Key-Value数据库,并且操作了多种语言的API性能测试将诶过表示SET操作每秒钟可达110000次,GET操作每秒81000次,当然不同的服务器配置性能不同,redis目前提供五种数据类型,string(字符串),list(链表),hash(哈希),set(集合)及zset(sorted set)有序集合。说到Redis,小伙伴们可能会想到mysql,小编给小伙伴们推荐一篇文章,文中详细的描述了Redis和mysql,喜欢这个的也可以查看。

  我们在前面的介绍中了解到,redis目前提供五种数据类型,如以下几种:

  1. string(字符串)
  2. list(链表)
  3. hash(哈希)
  4. set(集合)
  5. zset(sorted set)有序集合

    那么这些是如何进行存储的呢?下面让我们来详细了解一下。步骤如下:

  步骤1:我们需要新建一个空白项目,如图1所示:

  

图1

   步骤2:添加一个控制台应用程序,如图2所示:

  

图2

  步骤3:有三个dll文件,redis为c#开放的API,我们就是通过她来操作redis,为此,我们需要引用dll文件,点击浏览,如图3所示:

  

图3

  步骤4:找到需要引用的dll文件,如图4所示:

  

图4

  接着,我们就来看如何对数据类型进行存储.

   一、String类型

      String类型是最常用的一种数据类型,普通的key/value存储都可以归为此类,一个key对应一个value,string类型二进制的,Redis的string可以包含任何数据,例如jpg或序列化的对象,我们来看具体的代码该如何编写,参考代码已给出,如下所示:

  [csharp] view plain copy print?

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  using System.Threading.Tasks;

  using ServiceStack.Redis;

  namespace RedisApp

  {

  class Program

  {

  static void Main(string[] args)

  {

  //字符串类型

  var client = new RedisClient("local", 6379); //首先new一个客户端

  client.Set("name", "laowang"); // 存储字符串类型

  string userName = client.Get("name"); //通过get取值

  Console.WriteLine(userName);

  Console.ReadKey();

  }

  }

  }

  

  接下来我们来看哈希表的存储,hash是一个string类型的field和value的映射表,hash特别适合存储对象,与对象的每个字段存成单个string类型相比,一个对象存储在hash类型中会占用更少的内存,而且可以更方便的存取整个对象。作为一个key value存在,很多开发者自然的使用set/get方式来使用Redis,实际上这并不是最优化的使用方法,尤其在未启用VM情况下,Redis全部数据需要放入内存,节约内存尤其重要,参考代码已给出,如下所示:  [csharp] view plain copy print?

    using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  using System.Threading.Tasks;

  using ServiceStack.Redis;

  namespace RedisApp

  {

  class Program

  {

  static void Main(string[] args)

  {

  //字符串类型

  var client = new RedisClient("local", 6379); //首先new一个客户端

  client.Set("name", "laowang"); // 存储字符串类型

  string userName = client.Get("name"); //通过get取值

  Console.WriteLine(userName);

  Console.ReadKey();

  //哈希存储结果

  client.SetEntryInHash("userinfoId", "name", "zhangsan");

  client.GetHashKeys("userinfoId"); //获取所有的key

  client.GetHashValues("userinfoId"); //获取所有的值

  }

  }

  }

  

  我们再来看list类型,list是一个链表结构的,主要功能是push,pop获取一个范围的左右的值等,操作中key理解为链表名称,Redis的list类型其实就是一个每个字元素都是string类型的双向链表,我们可以通过push,pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,也可以作为队列,Redis list的实现为一个双向链表,既可以支持反向查找与遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构,参考代码已给出,如下所示:

   [csharp] view plain copy print?

   using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  using System.Threading.Tasks;

  using ServiceStack.Redis;

  namespace RedisApp

  {

  class Program

  {

  static void Main(string[] args)

  {

  //字符串类型

  var client = new RedisClient("local", 6379); //首先new一个客户端

  client.Set("name", "laowang"); // 存储字符串类型

  string userName = client.Get("name"); //通过get取值

  Console.WriteLine(userName);

  Console.ReadKey();

  //哈希存储结果

  client.SetEntryInHash("userinfoId", "name", "zhangsan");

  client.GetHashKeys("userinfoId"); //获取所有的key

  client.GetHashValues("userinfoId"); //获取所有的值

  //队列使用

  client.EnqueueItemOnList("name1", "laowang");//入队

  client.EnqueueItemOnList("name1", "laoma");//入队

  int length = client.GetListCount("nama1");

  for (int i = 0; i < length; i++)

  {

  Console.WriteLine(client.DequeueItemFromList("name1")); //出队

  }

  //栈的使用

  client.PushItemToList("name2", "laowang");//入栈

  client.PushItemToList("name2", "laoma");

  int lentgh = client.GetListCount("name2");

  {

  Console.WriteLine(client.PopItemFromList("name2"));//出栈

  }

  }

  }

  }

  

  二、Set类型

  她是string类型的无序集合,set是通过hash table实现的,添加、删除和查找,对集合我们可以取并集、交集、差集。对Set类型进行操作,参考代码已给出,如下所示:

    [csharp] view plain copy print?

    using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  using System.Threading.Tasks;

  using ServiceStack.Redis;

  namespace RedisApp

  {

  class Program

  {

  static void Main(string[] args)

  {

  //字符串类型

  var client = new RedisClient("local", 6379); //首先new一个客户端

  client.Set("name", "laowang"); // 存储字符串类型

  string userName = client.Get("name"); //通过get取值

  Console.WriteLine(userName);

  Console.ReadKey();

  //哈希存储结果

  client.SetEntryInHash("userinfoId", "name", "zhangsan");

  client.GetHashKeys("userinfoId"); //获取所有的key

  client.GetHashValues("userinfoId"); //获取所有的值

  //队列使用

  client.EnqueueItemOnList("name1", "laowang");//入队

  client.EnqueueItemOnList("name1", "laoma");//入队

  int length = client.GetListCount("nama1");

  for (int i = 0; i < length; i++)

  {

  Console.WriteLine(client.DequeueItemFromList("name1")); //出队

  }

  //栈的使用

  client.PushItemToList("name2", "laowang");//入栈

  client.PushItemToList("name2", "laoma");

  int lentgh = client.GetListCount("name2");

  {

  Console.WriteLine(client.PopItemFromList("name2"));//出栈

  }

  //对Set类型进行操作

  client.AddItemToSet("a3", "ddd");

  client.AddItemToSet("a3", "ccc");

  client.AddItemToSet("a3", "ttt");

  client.AddItemToSet("a3", "sss");

  client.AddItemToSet("a3", "hhh");

  System.Collections.Generic.HashSet hashset = client.GetAllItemsFromSet("a3");

  foreach (string str in hashset)

  {

  Console.WriteLine(str);

  }

  }

  }

  }

  

  三、Sorted Set类型

  Sorted set为set的一个升级版本,她是在set的基础撒花姑娘增加了一个顺序的属性,这一个属性在添加修改,元素的时候可以指定,每次指定后,zset(表示有序集合)会自动重新按新的值调整顺序,可以理解为有序列的表,一列存value,一列存顺序,操作中key理解为zset的名字。Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(scord)的参数来为成员排序,并且是插入有序的,即自动排序,当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,参考代码已给出,如下所示:

  [csharp] view plain copy print?

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  using System.Threading.Tasks;

  using ServiceStack.Redis;

  namespace RedisApp

  {

  class Program

  {

  static void Main(string[] args)

  {

  //字符串类型

  var client = new RedisClient("local", 6379); //首先new一个客户端

  client.Set("name", "laowang"); // 存储字符串类型

  string userName = client.Get("name"); //通过get取值

  Console.WriteLine(userName);

  Console.ReadKey();

  //哈希存储结果

  client.SetEntryInHash("userinfoId", "name", "zhangsan");

  client.GetHashKeys("userinfoId"); //获取所有的key

  client.GetHashValues("userinfoId"); //获取所有的值

  //队列使用

  client.EnqueueItemOnList("name1", "laowang");//入队

  client.EnqueueItemOnList("name1", "laoma");//入队

  int length = client.GetListCount("nama1");

  for (int i = 0; i < length; i++)

  {

  Console.WriteLine(client.DequeueItemFromList("name1")); //出队

  }

  //栈的使用

  client.PushItemToList("name2", "laowang");//入栈

  client.PushItemToList("name2", "laoma");

  int lentgh = client.GetListCount("name2");

  {

  Console.WriteLine(client.PopItemFromList("name2"));//出栈

  }

  //对Set类型进行操作

  client.AddItemToSet("a3", "ddd");

  client.AddItemToSet("a3", "ccc");

  client.AddItemToSet("a3", "ttt");

  client.AddItemToSet("a3", "sss");

  client.AddItemToSet("a3", "hhh");

  System.Collections.Generic.HashSet hashset = client.GetAllItemsFromSet("a3");

  foreach (string str in hashset)

  {

  Console.WriteLine(str);

  }

  //Sorted Set类型

  client.AddItemToSortedSet("a5", "ffff");

  client.AddItemToSortedSet("a5", "bbbb");

  client.AddItemToSortedSet("a5", "gggg");

  client.AddItemToSortedSet("a5", "cccc");

  client.AddItemToSortedSet("a5", "aaaa");

  System.Collections.Generic.List list = client.GetAllItemsFromSortedSet("a5");

  foreach (string str in list)

  {

  Console.WriteLine(str);

  }

  }

  }

  }

  

 在本文中,小编主要简单的介绍了一下Redis和数据存储的类型,在redis中还有一个很重要的事儿,差点儿忘了,文件并发(日志处理),多线程操作同一个文件时会出现并发问题,解决办法:

  •    一个办法就是给文件加锁(lock),但这样的操作文件时,其他的都得等待,这样的话性能非常差。
  •    另外一个解决方案,就是先将数据放在队列中,然后开启一个线程,负责从队列中取出数据,再写到文件中。  
网络编辑必备工具箱,网络编辑之家(www.editorsky.com)荣誉出品
  • 文章格式化编辑
  • 繁简体相互转换
  • 文字挑错功能(1000个错别字词库)
  • 可定制段前是否空格
  • 只需鼠标点击
  • 全傻瓜式操作
文字挑错实例:洁白无暇(洁白无瑕),黄梁美梦(黄粱美梦),美仑美奂(美伦美奂)