前段時間學習了Redis,一直在忙着工做和一些其餘的事情,這兩天有空了,就把這學習到的技術分享出來給你們,謝謝redis
1、.Redis是什麼?數據庫
Redis是一個徹底免費開源的,基於內存的高性能的key-value存儲系統,能夠用做數據庫、緩存和消息中間件。支持多種類型的數據結構.緩存
Redis內置數據持久化、LRU驅動事件、事物、主從複製、哨兵機制、集羣、自動分區、lua腳本提供高可用性..微信
Redis全稱爲:Remote Dictionary Server (遠程數據服務)session
Redis是一種非關係型數據庫數據結構
2、Redis的特色dom
Redis之內存做爲數據存儲介質,讀寫數據的效率極高。速度快:使用標準c語言編寫,全部數據在內存存儲,讀速度:110000次/s 寫速度:81000次/s分佈式
Redis跟memcache不一樣的是,儲存在Redis中的數據是持久化的,斷電或重啓,數據也不會丟失。性能
Redis的存儲分爲內存存儲、磁盤存儲和log文件。學習
Redis能夠從磁盤從新將數據加載到內存中,也能夠經過配置文件對其進行配置,所以,redis才能實現持久化。
Redis支持主從模式,能夠配置集羣,更利於支撐大型的項目。
Redis是單線程:一次只能執行一條命令,拒絕長命令(由於Redis基於內存,不牽扯磁盤IO操做限制)
3、Redis應用場景
緩存: 配合關係型數據庫作高速緩存(string),會話緩存(最經常使用)
消息隊列
活動排行榜,計數器: 用戶點贊,評論數,投票,網站訪問量,點擊率等(zset)
發佈,訂閱消息(消息通知)
商品列表,評論列表
分佈式鎖: 分佈式環境下,訪問共享資源(string)
分佈式session: 分佈式環境下,須要session共享(string)
用戶信息,發佈文章信息等(hash)
朋友圈,微博時間線,自動補全聯繫人(list)
抽獎系統,給用戶添加標籤,給標籤添加用戶、共同關注
GEO(計算兩地距離,外賣小哥距你還有多少米)
4、Redis數據類型(這裏的案例都是用C#控制檯程序作的,不是特別全面)
Redis有五種數據類型(String,Hash,Set,ZSet,List )
首先搭建一個控制檯應用程序,添加應用(Nuget裏面去找)如圖:
就會獲得相應的引用
1.String
/// <summary> /// string /// </summary> public static void TestString() { using (RedisClient client = new RedisClient("127.0.0.1", 6379)) { //清空Redis裏面的全部緩存 client.FlushAll(); //存儲 client.Set<string>("name", "admin"); client.Set("password", "123456"); //讀取 string name = client.Get<string>("name"); string pwd = client.Get<string>("password"); Console.WriteLine(name); Console.WriteLine(pwd); } }
//結果如圖
2.Hash
/// <summary> /// Hash /// </summary> public static void TestHash() { using (RedisClient client = new RedisClient("127.0.0.1", 6379)) { //清空Redis裏面的全部緩存 client.FlushAll(); //配置數據 Dictionary<string, string> dictionary = new Dictionary<string, string>(); dictionary.Add("a", "1"); dictionary.Add("b", "2"); dictionary.Add("c", "3"); dictionary.Add("d", "4"); dictionary.Add("e", "5"); //緩存 client.SetRangeInHash("dictionary", dictionary); //追加 client.SetEntryInHash("dictionary", "666", "fgh"); //獲取存入的數據 Dictionary<string, string> hashData = client.GetAllEntriesFromHash("dictionary"); foreach (var item in hashData) { Console.WriteLine($"Key是:{item.Key}------Vaule值是:{item.Value}"); } } }
//結果如圖
3.Set
/// <summary> /// Set /// </summary> public static void TestSet() { using (RedisClient client = new RedisClient("127.0.0.1", 6379)) { //清空Redis裏面的全部緩存 client.FlushAll(); client.AddItemToSet("微信A", "好友A"); client.AddItemToSet("微信A", "好友B"); client.AddItemToSet("微信A", "好友C"); client.AddItemToSet("微信A", "好友D"); client.AddItemToSet("微信A", "好友2"); client.AddItemToSet("微信B", "好友1"); client.AddItemToSet("微信B", "好友A"); client.AddItemToSet("微信B", "好友D"); client.AddItemToSet("微信B", "好友F"); client.AddItemToSet("微信B", "好友G"); //獲取交集(獲取相同的好友) var setunion = client.GetIntersectFromSets("微信A", "微信B"); Console.WriteLine("微信A和微信B的共同好友爲:"); foreach (var item in setunion) { Console.WriteLine(item); } } }
//結果爲
//這是緩存客戶端看到的緩存內容
4.Zset
/// <summary> /// Zset /// </summary> public static void TestZSet() { using (RedisClient client = new RedisClient("127.0.0.1", 6379)) { //清空Redis裏面的全部緩存 client.FlushAll(); client.AddItemToSortedSet("主播安妮", "粉絲1", 50); client.AddItemToSortedSet("主播安妮", "粉絲2", 20); client.AddItemToSortedSet("主播安妮", "粉絲3", 68); client.AddItemToSortedSet("主播安妮", "粉絲4", 31); client.IncrementItemInSortedSet("主播安妮", "粉絲4", new Random().Next(200, 500)); var TopList = client.GetAllItemsFromSortedSetDesc("主播安妮"); Console.WriteLine("刷禮物排行榜爲"); foreach (var item in TopList) { Console.WriteLine(item); } } }
//結果爲
5.List
/// <summary> /// List /// </summary> public static void TestList() { using (RedisClient client = new RedisClient("127.0.0.1", 6379)) { //清空Redis裏面的全部緩存 redisClient.FlushAll(); //隊(在前面加入) client.EnqueueItemOnList("QueueList", "打印任務1"); client.EnqueueItemOnList("QueueList", "打印任務2"); client.EnqueueItemOnList("QueueList", "打印任務3"); client.EnqueueItemOnList("QueueList", "打印任務4"); //獲取QueueList緩存個數 long q = client.GetListCount("QueueList"); for (int i = 0; i < q; i++) { //【先進先出】取值的時候先取 「入棧操做1-->2-->3-->4」 Console.WriteLine("QueueList出隊值:{0}", client.DequeueItemFromList("QueueList")); } Console.WriteLine("---------------------------------------------------------------"); //棧(在後面加入) client.PushItemToList("StackList", "入棧操做1"); client.PushItemToList("StackList", "入棧操做2"); client.PushItemToList("StackList", "入棧操做3"); client.PushItemToList("StackList", "入棧操做4"); long p = client.GetListCount("StackList"); for (int i = 0; i < p; i++) { //【後進先出】取值的時候先取 「入棧操做4-->3-->2-->1」 Console.WriteLine("StackList出棧值:{0}", client.PopItemFromList("StackList")); } } }
//結果
//這個比較複雜一點,須要結合輸出值對應着看