Redis的資料結構及應用場景

Java大蝸牛發表於2018-12-21

一. 談談對redis的理解,它的應用場景。

Redis是一個key-value儲存系統,它支援儲存的value型別包括string字串、list連結串列、set集合、sorted Set有序集合和hash雜湊等資料型別。這些資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的,支援各種不同方式的排序。為了保證效率,Redis將資料都快取在記憶體中,並週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,在此基礎上實現master-slave(主從)同步。

Redis的應用場景 資料型別應用場景StringString是最常用的一種資料型別,普通的key/value儲存都可以歸為此類。List關注列表、粉絲列表、訊息佇列等。SetSet提供一個與 List類似的列表功能,特殊之處在於Set會自動排序、去重,當需要儲存一個列表資料,又不希望有重複資料時,Set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的重要介面,這個也是list所不能提供的。

1.使用Set儲存一些集合性的資料,比如在微博應用中,可以將一個使用者所有的關注人存在一個集合中,將其所有粉絲存在一個集合;

2.可以對集合取交集、並集、差集,應用到好友推薦、共同關注等。

3.還可以利用唯一性,統計訪問網站的所有獨立IP。

SortedSetSortedSet與Set的使用場景類似,是不允許重複項的String集合。

1.SortedSet可以透過提供一個優先順序(score)的引數為成員排序,並且是插入有序的,即自動排序,可以應用於積分排行榜等。

2.如果需要一個有序且不重複的集合列表,可以選擇sorted set資料結構,比如twitter 的public timeline可以以發表時間作為score來儲存,這樣獲取時就是自動按時間排好序的。

3.用SortedSet做帶權重的佇列,比如普通訊息的score為1,重要訊息的score為2,然後工作執行緒可以選擇按score的倒序來獲取工作任務,讓重要的任務優先執行。

Hash 儲存一個學生資訊物件資料,欄位包括:id、姓名、班級、年齡等,透過id可以獲取/修改任意的欄位。

二. 既然一般的語言也能支援string、list、hash等資料結構,為什麼還要用redis呢?

這裡要先提一下 記憶體和快取的區別

記憶體是物理上的,是一種物理儲存介質。

快取是邏輯上的概念,是一種資料結構,可以是PHP語言裡面的一種資料結構,也可以是Redis裡面的一種資料結構。比如:用PHP陣列存一些資料,每次有需求就直接從陣列中讀取;用PHP語言設計了一個快取,用一個陣列做佇列,設計了一個基於先進先出策略的快取;呼叫Redis的一些資料結構來儲存資料。

記憶體叫做RAM,隨機可讀儲存器,硬碟一般叫做ROM,隨機只讀儲存器。

快取包括cpu的一二級快取、純記憶體結構的快取、半記憶體快取、磁碟快取,它們的速度是一層比一層慢。當CPU要讀取一個資料時,首先從一級快取中查詢,如果沒有找到再從二級快取中查詢,如果還是沒有就從三級快取或記憶體中查詢,程式裡面的各種資料結構、變數等等,都是執行在記憶體裡面,而不是在硬碟上。

假設有一個場景,比如歷史使用者日誌訪問資料,就是access_log,讓你去統計都有哪些使用者登入了這個網站,當然現在還有使用者在持續登入著。這個時候你是不是要先去從access_log裡面讀取日誌,然後提取出日誌裡面的userId,存到陣列裡面再去重。當新使用者來的時候,你只需要和你陣列裡面的使用者進行比較即可,就不需要再讀取access_log檔案了。這樣就不用每次讀取檔案,只需要讀取陣列即可,速度回更快。 同理用Redis,也是因為當我們需要讀取資料時,先從Redis查詢,如果有就直接返回,不用再從mysql查詢,速度會很快。

從原理上講,PHP裡面的資料結構用的是純記憶體,而Redis是需要走網路的;

從速度上講,純記憶體的速度肯定是比先走網路、再從記憶體中讀取的速度快。

雖然Redis作為半記憶體快取,沒有直接記憶體結構的資料結構速度快,但Redis除了資料結構豐富外,還適合高併發場景,對高併發處理效率極高,此外可以做到叢集式、可持久化。

三. 具體講一下Redis的資料結構,儘可能的舉出他們的應用場景。

Redis支援String、List、Set、Sorted Set、Hash等。

  • String型別是二進位制安全的,可以用來快取一些靜態檔案,如圖片、影片、css檔案等。支援incr操作,可以用作計數器,比如統計網站訪問次數等。
  • 微博中“關注、粉絲”、論壇中所有回帖的ID用的就是list列表,還有訊息佇列,也是列表。
  • Set可以快速查詢元素是否存在,用於記錄一些不能重複的資料。例如: 在網站註冊賬號時,使用者名稱不能重複,使用Set記錄註冊使用者,如果註冊的使用者名稱已經存在於Set中,就拒絕該使用者註冊。或者用於記錄做過某些事情。例如: 在某些投票系統中,每個使用者一天只能投票一次,就可以用Set來記錄某個使用者的投票情況。
  • 順便給大家推薦一個Java架構群:834962734  裡面會分享一些資深架構師錄製的影片 資料 :有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能最佳化、分散式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多!
  • Set能做的事Sorted Set也能做,Sorted Set還能完成一些Set不能做的事情。例如:使用Sorted Set構建一個具有優先順序的佇列。
  • Hash適用於儲存物件,比如把使用者的資訊存到hash裡,以使用者id為key,使用者的詳細資訊為value。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545684/viewspace-2286099/,如需轉載,請註明出處,否則將追究法律責任。

相關文章