啥是redis?

1. 簡介

1.1 什麼是redis?

Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。總結:Redis是個非關係型數據庫,也就是傳說中的key-value數據庫。具體能幹些啥,請繼續往下看。

2 爲啥要用Redis?

當大量請求去訪問/修改的時候,不僅可能會出現加載慢更有可以會造成其他的一些事故,比如凌晨兩點作爲一個程序員你可能會接到老大叫你起來修復程序的電話 - -!,所以在此時,redis顯得尤爲重要了,redis基本的工作流程如下圖:

 

<圖1>

 

<圖2>

通過上圖可以明確redis工作的基本流程,不僅可以爲數據庫分擔壓力,還會爲響應增加速度;不過這裏心細的小夥伴可能會感覺這樣會有問題:高併發的時候使用,在請求修改的時候又有人過來請求讀操作,豈不是拿不到正確的值?這裏我們就來看下redis的幾個過期策略。

2.1 簡單粗暴-所有的數據結構都可以設置過期時間,時間一到,就會自動刪除。

2.2 定期刪除策略:redis默認每個100ms檢查,從字典裏隨機抽取20個key --> 刪除過期的數據 --> 如果過期的數量超過1/4就繼續執行。爲了避免循環過度導致線程卡死,默認掃描時間上限爲25ms。定期刪除會導致有過期的key沒有被刪除。

2.3 惰性刪除:在客戶端請求獲取某個key的時候,redis會檢查一下,這個key如果過期了此時就會刪除。

2.4 內存淘汰機制:常見的兩種:一種是在設置了過期時間的鍵空間中,優先移除最近未使用的key,另一種設置就是直接優先移除最近未使用的key。

3 redis的幾種數據類型

5 種基礎數據結構:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。

3.1 String

動態可修改,容量capacity一般要高於實際長度len,當len小於1M時容量翻倍;超過1M時,增加1M的容量;最大長度爲512M;如果value爲整數,可以進行自增操作;可以用於:常規的計數操作,如文章數、粉絲數。

3.2 list

Redis 的列表相當於 Java 語言裏面的 LinkedList;這意味着 list 的插入和刪除操作非常快,時間複雜度爲 O(1),但是索引定位很慢,時間複雜度爲 O(n);當列表彈出了最後一個元素之後,該數據結構自動被刪除,內存被回收。

可以用於:粉絲列表、異步隊列:把需要延後處理的數據序列化成字符串裝進列表,另起線程進行輪詢操作;比如記錄用戶瀏覽記錄,根據記錄進行相關內容的推薦的實現;另外可以通過push和pop進行頭部/尾部進行增刪,即可以爲隊列又可以爲數組。

3.3 hash (字典)

Redis 的字典相當於 Java 語言裏面的 HashMap,它是無序字典。內部實現結構上同 Java 的 HashMap 也是一致的,同樣的數組 + 鏈表二維結構可以用於:存儲部分變更信息,如用戶信息(存放的是結構化的對象)。

3.4 set (集合)

Redis 的集合相當於 Java 語言裏面的 HashSet;無序且自動去重,並提供判斷某個成員是否存在集合中的接口;當集合中最後一個元素移除之後,數據結構自動刪除,內存被回收。

可以用於:共同好友、二度好友等功能。

3.5 Zset(有序集合)

與set類似,Zset是有序的,並且提供給每個value設置score,代表value排序權重;內部實現爲跳躍列表;zest集合中最後一個value被移除後,數據結構自動刪除,內存被回收。

可以用於:學生與分數。

至於redis的安裝及幾種數據類型的操作我們下集再講

喜歡請掃碼關注我,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章