Redis的初識

  • 2019 年 10 月 3 日
  • 筆記

簡介

  已經有了Membercache和各種資料庫,Redis為什麼會產生?Redis純粹為應用而產生,它是一個高性能的key-value資料庫。Redis的出現,很大程式補償了Memcached這類key-value存儲的不足,解決了斷電後資料庫完全丟失的情況;在部分場合可以對關係資料庫起到很好的補償作用。性能測試結果表示SET操作每秒鐘可達110000,GET操作每秒81000次(當然不同的伺服器配置性能不同)。

  Redis是一種面向”鍵-值”對類型數據的分散式NoSQL資料庫系統,特點是高性能,持久存儲,適應高並發的應用場景。和Memcache類似,它支援存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)和zset(有序集合)。這些數據類型支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的,支援各種不同方式的排序。Redis與Memcache一樣,為了保證效率,數據都是快取在記憶體中,區別的是Redis會周期性的把更新的數據寫入磁碟或者修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。

  Redis目前提供四種數據類型:string、list、set、zset

  Redis的存儲分為記憶體存儲、磁碟存儲和log文件三部分,配置文件中有三個參數對其進行配置。

    1、save seconds updates:指出在多長時間內,有多少次更新操作,就將數據同步到數據文件。

    2、appendonly yes/no:是否在每次更新操作後進行日誌記錄。如果不開啟,可能會在斷電時導致一段時間內的數據丟失。因為Redis本身數據同步文件是按上面save條件來同步的,所以有的數據會在一段時間內只存在記憶體中。

    3、appendfsync no/always/everysec:數據快取同步至磁碟的方式。no表示等作業系統進行數據快取同步到磁碟,always表示每次更新操作後手動調用fsync()將數據寫到磁碟,everysec表示每秒同步一次。

 安裝及使用

下載地址:https://github.com/microsoftarchive/redis/releases

百度雲盤:

鏈接:https://pan.baidu.com/s/1ObkTyQ5hrCYoVGWkqanfFQ
提取碼:d3yo

第一步:下載後解壓本地磁碟上(註:目錄不能包括中文)

 

第二步: 定位到解壓redis目錄下(cmd)

1 1、redis-server.exe        redis伺服器的daemon啟動程式  2 2、redis.windows.conf        redis配置文件  3 3、redis-cli.exe        redis命令行操作工具  4 4、redis-check-dump.exe        本地資料庫檢查  5 5、redis-check-aof.exe        更新日誌檢查  6 6、redis-benchmark.exe        性能測試,用於模擬同時由N個客戶端發送M個 SETs/GETs查詢(類似於Apache ab工具)

 第三步:啟動服務

  我們也可以啟動前配置下Redis,詳細配置請看:https://www.runoob.com/redis/redis-conf.html(配置文件:redis.windows.conf)

  這裡為了演示,直接用默認配置啟動即可

 

 配置文件參數

 

 

 

 

 

 

 

 

 

 

 

啟動方式2

 啟動方式3(以Window服務方式)

 1 安裝(redis-install.bat)   2 echo install redis-server   3 D:redisredis-server.exe --service-install D:redisredis.windows.conf --loglevel verbose   4   5   6 卸載(redis-uninstall.bat)   7 echo uninstall redis-server   8 D:redisredis-server.exe --service-uninstall   9  10 啟動(start-redis.bat)  11 echo start redis-server  12 D:redisredis-server.exe D:redisredis.windows.conf 

bat腳本

1 格式:redis-server --service-install redis.windows.conf

 第四步:連接Redis

 連上!!

 第五步:SET/GET

以下C#控制台程式碼演示

第一步:NuGet下載DLL類庫

 註:安裝最新版本的,項目框架應用高版本的,低版本的框架,可能不兼容高版本Redis

 不會下載的朋友,請到我百度雲盤下載:

鏈接:https://pan.baidu.com/s/1-Wzv0tnoXhi6XMkhv_90gw
提取碼:e9at

第二步:引入類庫

 第三步:引入命名空間

1 using ServiceStack.Redis;

第四步:實現(控制台)

  1 using ServiceStack.Redis;    2 using System;    3 using System.Collections.Generic;    4 using System.Linq;    5 using System.Text;    6 using System.Threading;    7    8 namespace RedisDemo    9 {   10     class Program   11     {   12         static void Main(string[] args)   13         {   14             //在Redis中存儲常用的5種數據類型:String,Hash,List,SetSorted set   15   16             RedisClient client = new RedisClient("192.168.1.102", 6379);   17   18             client.FlushAll();   19   20             //-----string開始----------   21             client.Add<string>("StringValueTime", "我已設置過期時間噢30秒後會消失", DateTime.Now.AddMilliseconds(30000));   22             while (true)   23             {   24                 if (client.ContainsKey("StringValueTime"))   25                 {   26                     Console.WriteLine("String.鍵:StringValue,值:{0} {1}", client.Get<string>("StringValueTime"), DateTime.Now);   27                     Thread.Sleep(10000);   28                 }   29                 else   30                 {   31                     Console.WriteLine("鍵:StringValue,值:我已過期 {0}", DateTime.Now);   32                     break;   33                 }   34             }   35   36             client.Add<string>("StringValue", " String和Memcached操作方法差不多");   37             Console.WriteLine("數據類型為:String.鍵:StringValue,值:{0}", client.Get<string>("StringValue"));   38   39             Student stud = new Student() { id = "1001", name = "李四" };   40             client.Add<Student>("StringEntity", stud);   41             Student Get_stud = client.Get<Student>("StringEntity");   42             Console.WriteLine("數據類型為:String.鍵:StringEntity,值:{0} {1}", Get_stud.id, Get_stud.name);   43             //-----string結束----------   44   45             //---------Hash開始---------------   46             client.SetEntryInHash("HashID", "Name", "張三");   47             client.SetEntryInHash("HashID", "Age", "24");   48             client.SetEntryInHash("HashID", "Sex", "");   49             client.SetEntryInHash("HashID", "Address", "上海市XX號XX室");   50   51             List<string> HaskKey = client.GetHashKeys("HashID");   52             foreach (string key in HaskKey)   53             {   54                 Console.WriteLine("HashID--Key:{0}", key);   55             }   56   57             List<string> HaskValue = client.GetHashValues("HashID");   58             foreach (string value in HaskValue)   59             {   60                 Console.WriteLine("HashID--Value:{0}", value);   61             }   62   63             List<string> AllKey = client.GetAllKeys(); //獲取所有的key。   64             foreach (string Key in AllKey)   65             {   66                 Console.WriteLine("AllKey--Key:{0}", Key);   67             }   68             //---------Hash結束---------------   69   70             //-----------List開始--------------   71             /*   72              * list是一個鏈表結構,主要功能是push,pop,獲取一個範圍的所有的值等,操作中key理解為鏈表名字。   73              * Redis的list類型其實就是一個每個子元素都是string類型的雙向鏈表。我們可以通過push,pop操作從鏈表的頭部或者尾部添加刪除元素,   74              * 這樣list既可以作為棧,又可以作為隊列。Redis list的實現為一個雙向鏈表,即可以支援反向查找和遍歷,更方便操作,不過帶來了部分額外的記憶體開銷,   75              * Redis內部的很多實現,包括發送緩衝隊列等也都是用的這個數據結構   76              */   77             client.EnqueueItemOnList("QueueListId", "1.張三");  //入隊   78             client.EnqueueItemOnList("QueueListId", "2.張四");   79             client.EnqueueItemOnList("QueueListId", "3.王五");   80             client.EnqueueItemOnList("QueueListId", "4.王麻子");   81             long q = client.GetListCount("QueueListId");   82             for (int i = 0; i < q; i++)   83             {   84                 Console.WriteLine("QueueListId出隊值:{0}", client.DequeueItemFromList("QueueListId"));   //出隊(隊列先進先出)   85             }   86   87             client.PushItemToList("StackListId", "1.張三");  //入棧   88             client.PushItemToList("StackListId", "2.張四");   89             client.PushItemToList("StackListId", "3.王五");   90             client.PushItemToList("StackListId", "4.王麻子");   91             long p = client.GetListCount("StackListId");   92             for (int i = 0; i < p; i++)   93             {   94                 Console.WriteLine("StackListId出棧值:{0}", client.PopItemFromList("StackListId"));   //出棧(棧先進後出)   95             }   96             //-----------List結束--------------   97   98             //----------Set無序集合開始------------   99             /*  100              它是string類型的無序集合。set是通過hash table實現的,添加,刪除和查找,對集合我們可以取並集,交集,差集  101              */  102             client.AddItemToSet("Set1001", "小A");  103             client.AddItemToSet("Set1001", "小B");  104             client.AddItemToSet("Set1001", "小C");  105             client.AddItemToSet("Set1001", "小D");  106             HashSet<string> hastsetA = client.GetAllItemsFromSet("Set1001");  107             foreach (string item in hastsetA)  108             {  109                 Console.WriteLine("Set無序集合ValueA:{0}", item); //出來的結果是無須的  110             }  111  112             client.AddItemToSet("Set1002", "小K");  113             client.AddItemToSet("Set1002", "小C");  114             client.AddItemToSet("Set1002", "小A");  115             client.AddItemToSet("Set1002", "小J");  116             HashSet<string> hastsetB = client.GetAllItemsFromSet("Set1002");  117             foreach (string item in hastsetB)  118             {  119                 Console.WriteLine("Set無序集合ValueB:{0}", item); //出來的結果是無須的  120             }  121  122             HashSet<string> hashUnion = client.GetUnionFromSets(new string[] { "Set1001", "Set1002" });  123             foreach (string item in hashUnion)  124             {  125                 Console.WriteLine("求Set1001和Set1002的並集:{0}", item); //並集  126             }  127  128             HashSet<string> hashG = client.GetIntersectFromSets(new string[] { "Set1001", "Set1002" });  129             foreach (string item in hashG)  130             {  131                 Console.WriteLine("求Set1001和Set1002的交集:{0}", item);  //交集  132             }  133  134             HashSet<string> hashD = client.GetDifferencesFromSet("Set1001", new string[] { "Set1002" });  //[返回存在於第一個集合,但是不存在於其他集合的數據。差集]  135             foreach (string item in hashD)  136             {  137                 Console.WriteLine("求Set1001和Set1002的差集:{0}", item);  //差集  138             }  139             //----------Set無序集合開始------------  140  141             //--------SetSorted 有序集合開始-------  142             /*  143              sorted set 是set的一個升級版本,它在set的基礎上增加了一個順序的屬性,這一屬性在添加修改.元素的時候可以指定,  144              * 每次指定後,zset(表示有序集合)會自動重新按新的值調整順序。可以理解為有列的表,一列存 value,一列存順序。操作中key理解為zset的名字.  145              */  146             client.AddItemToSortedSet("SetSorted1001", "1.劉仔");  147             client.AddItemToSortedSet("SetSorted1001", "2.星仔");  148             client.AddItemToSortedSet("SetSorted1001", "3.豬仔");  149             List<string> listSetSorted = client.GetAllItemsFromSortedSet("SetSorted1001");  150             foreach (string item in listSetSorted)  151             {  152                 Console.WriteLine("SetSorted有序集合{0}", item);  153             }  154             //--------SetSorted 有序集合開始-------  155             Console.ReadKey();  156         }  157         public class Student  158         {  159             public string id { get; set; }  160             public string name { get; set; }  161         }  162     }  163 }

 項目源碼:

鏈接:https://pan.baidu.com/s/1LmnGrRHQkZbHxEM3KDfzwA
提取碼:tbkc

覺得對你有幫助的話,幫忙推薦下,有不懂的地方,歡迎下方留言!!