還不懂Redis是什麼?一文帶你深入Redis基本結構,準備向開發進軍

前言

Redis是互聯網技術領域使用最爲廣泛的存儲中間件,它是「Remote Dictionary Service」的首字母縮寫,也就是「遠程字典服務」。Redis 以其超高的性能、完美的文檔、簡潔易懂的源碼和豐富的客戶端庫支持在開源中間件領域廣受好評。國內外很多大型互聯網公司都在使用Redis, 比如Twitter、 YouPorn、 暴雪娛樂、Github、 StackOverflow、 騰訊、阿里、京東、華爲、新浪微博等等,很多中小型公司也都有應用。也可以說,對Redis 地瞭解和應用實踐已成爲當下中高級後端開發者繞不開的必備技能。

Redis安裝

體驗Redis需要使用Linux或者Mac環境,如果是Windows可以考慮使用虛擬機。

主要方式有四種:

使用Docker安裝。通過Github源碼編譯。直接安裝apt-get install(Ubuntu)、 yum instal(RedHat)或者brew install(Mac)。如果不想安裝操作,也可以使用網頁版的Web Redis直接體驗。具體操作如下:

Docker方式

#拉取redis鏡像> docker pull redis .#運行redis容器〉docker run - name myredis -d -p6379:6379 redis .#執行容器中的redis-cli, 可以直接使用命令行操作redis> docker exec -it myredis redis-cli

Github源碼編譯方式

#下載源碼> git clone --branch 2.8 - -depth 1 git@gi thub. com:antirez/redis. git> cd redis#編譯> make> cd src#運行服務器,daemonize表示在後臺運行> . /redis-server - daemonize yes#運行命令行> . /redis-cli

直接安裝方式

# mac> brew install redis# ubuntu〉apt- get install redis# redhat〉yum install redis#運行客戶端> redis-cli

Redis基礎數據結構

Redis有5種基礎數據結構,分別爲: string (字符串)、list (列表)、set (集合)、hash (哈希)和zset(有序集合)。熟練掌握這5種基本數據結構的使用是Redis 知識最基礎也最重要的部分,它也是在Redis面試題中問到最多的內容。

一、string (字符串)

字符串 string 是 Redis 最簡單的數據結構。Redis 所有的數據結構都是以唯一的 key 字符串作爲名稱,然後通過這個唯一 key 值來獲取相應的 value 數據。不同類型的數據結 構的差異就在於 value 的結構不一樣。

字符串結構使用非常廣泛,一個常見的用途就是緩存用戶信息。我們將用戶信息結構體使用 JSON 序列化成字符串,然後將序列化後的字符串塞進 Redis 來緩存。同樣,取用戶 信息會經過一次反序列化的過程。

Redis 的字符串是動態字符串,是可以修改的字符串,內部結構實現上類似於 Java 的 ArrayList,採用預分配冗餘空間的方式來減少內存的頻繁分配,如圖中所示,內部爲當前字 符串實際分配的空間 capacity 一般要高於實際字符串長度 len。當字符串長度小於 1M 時, 擴容都是加倍現有的空間,如果超過 1M,擴容時一次只會多擴 1M 的空間。需要注意的是 字符串最大長度爲 512M。

二、list (列表)

Redis 的列表相當於 Java 語言裏面的 LinkedList,注意它是鏈表而不是數組。這意味着 list 的插入和刪除操作非常快,時間複雜度爲 O(1),但是索引定位很慢,時間複雜度爲 O(n),這點讓人非常意外。

當列表彈出了最後一個元素之後,該數據結構自動被刪除,內存被回收。

Redis 的列表結構常用來做異步隊列使用。將需要延後處理的任務結構體序列化成字符 串塞進 Redis 的列表,另一個線程從這個列表中輪詢數據進行處理。

三、hash (哈希字典)

Redis 的字典相當於 Java 語言裏面的 HashMap,它是無序字典。內部實現結構上同 Java 的 HashMap 也是一致的,同樣的數組 + 鏈表二維結構。第一維 hash 的數組位置碰撞 時,就會將碰撞的元素使用鏈表串接起來。

不同的是,Redis 的字典的值只能是字符串,另外它們 rehash 的方式不一樣,因爲Java 的 HashMap 在字典很大時,rehash 是個耗時的操作,需要一次性全部 rehash。Redis 爲了高性能,不能堵塞服務,所以採用了漸進式 rehash 策略。

漸進式 rehash 會在 rehash 的同時,保留新舊兩個 hash 結構,查詢時會同時查詢兩個 hash 結構,然後在後續的定時任務中以及 hash 的子指令中,循序漸進地將舊 hash 的內容 一點點遷移到新的 hash 結構中。

當 hash 移除了最後一個元素之後,該數據結構自動被刪除,內存被回收。

hash 結構也可以用來存儲用戶信息,不同於字符串一次性需要全部序列化整個對象,hash 可以對用戶結構中的每個字段單獨存儲。這樣當我們需要獲取用戶信息時可以進行部分 獲取。而以整個字符串的形式去保存用戶信息的話就只能一次性全部讀取,這樣就會比較浪 費網絡流量。

hash也有缺點,hash 結構的存儲消耗要高於單個字符串,到底該使用 hash 還是字符串,需要根據實際情況再三權衡。

四、set (集合)

Redis 的集合相當於 Java 語言裏面的 HashSet,它內部的鍵值對是無序的唯一的。它的 內部實現相當於一個特殊的字典,字典中所有的 value 都是一個值 NULL。

當集合中最後一個元素移除之後,數據結構自動刪除,內存被回收。 set 結構可以用來 存儲活動中獎的用戶 ID,因爲有去重功能,可以保證同一個用戶不會中獎兩次。

五、zset (有序列表)

zset 可能是 Redis 提供的最爲特色的數據結構,它也是在面試中面試官最愛問的數據結 構。它類似於 Java 的 SortedSet 和 HashMap 的結合體,一方面它是一個 set,保證了內部 value 的唯一性,另一方面它可以給每個 value 賦予一個 score,代表這個 value 的排序權重。它的內部實現用的是一種叫着{跳躍列表}的數據結構。

zset 中最後一個 value 被移除後,數據結構自動刪除,內存被回收。 zset 可以用來存 粉絲列表,value 值是粉絲的用戶 ID,score 是關注時間。我們可以對粉絲列表按關注時間進行排序。

zset 還可以用來存儲學生的成績,value 值是學生的 ID,score 是他的考試成績。我們 可以對成績按分數進行排序就可以得到他的名次。

已上就是咱們介紹的Redis基礎入門,後續小編會陸續更新Redis實戰應用,希望大家喜歡。

請多多點贊評論分享,關注小編,你們的支持就是小編最大的動力!!!

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