• 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),但這樣的操作文件時,其他的都得等待,這樣的話性能非常差。
  •    另外一個解決方案,就是先將數據放在隊列中,然后開啟一個線程,負責從隊列中取出數據,再寫到文件中?! ?/li>
網絡編輯必備工具箱,網絡編輯之家(www.editorsky.com)榮譽出品
  • 文章格式化編輯
  • 繁簡體相互轉換
  • 文字挑錯功能(1000個錯別字詞庫)
  • 可定制段前是否空格
  • 只需鼠標點擊
  • 全傻瓜式操作
文字挑錯實例:潔白無暇(潔白無瑕),黃梁美夢(黃粱美夢),美侖美奐(美倫美奐) 
什么行业的讲师最赚钱 山西11选5任二遗漏 金点子股票软件 爱彩乐彩票网 甘肃11选5五码遗漏 天天三分彩走势 期货配资公司排名 贵州快3走势图爱彩乐 极速赛车计划app推荐 体彩11选五5势图辽宁 浙江舟山体育彩票飞鱼