記憶體越來越便宜的今天,我們來談談Redis
什麼是Redis? Redis是一個基於記憶體的高效能key-value資料庫(Key-value資料庫是一種以鍵值對儲存資料的一種資料庫)
Redis有什麼特點 從本質上來說是一個key-value記憶體資料庫,整個資料庫統統載入在記憶體上進行操作,定期通過非同步操作把資料庫資料flush到硬碟上進行儲存,是目前最快的key-value DB Redis出色之處不僅僅在於效能,Redis最大的魅力在於能夠儲存多種的資料結構,並且單的value最大限制是1GB,因此Redis可以用來實現很多有用的功能,比方說用他的List來做雙向連結串列,實現一個輕量級的訊息佇列服務,用他的Set做高效能的tag系統等等。 當然有優點肯定也有缺點,主要的缺點就是受到實體記憶體的限制,不能作為海量資料的高效能讀寫,所以一般來說,Redi適合的場景主要侷限在較小的資料量高效能操作和運算上。
Redis是單程序單執行緒的,利用佇列技術將併發訪問變為序列訪問,消除了傳統資料庫序列控制的開銷
Redis支援的資料型別 1.strings(字串) a)如果只使用redis中的字串型別,且不使用redis的持久化功能,那麼,redis就和memcache非常非常的像了; b)在遇到數值操作時,會自動轉換過為字串,如寫入數字1,讀出來將是字串1; c)本身具有原子性的指令:incr、decr和Memecached中increment、decrement類似; d)應用場景:常規計數-微博數,粉絲數;
2.lists(列表) a)lists資料型別的實現不是陣列而是通過連結串列這種資料結構實現; b)使用Lists結構,我們可以輕鬆地實現最新訊息排行等功能。Lists的另一個應用就是訊息佇列,可以利用Lists的PUSH操作,將任務存在Lists中,然後工作執行緒再用POP操作將任務取出進行執行; c)每個子元素都是String型別的雙向連結串列,可以通過push和pop操作從列表的頭部或者尾部新增或者刪除元素,這樣List即可以作為棧,也可以作為佇列;
3.sets(無序集合) a)所謂集合就是一堆不重複值的組合,並且是沒有順序的; b)在微博應用中,可以將一個使用者所有的關注人存在一個集合中,將其所有粉絲存在一個集合。Redis還為集合提供了求交集、並集、差集等操作,可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中。
4.sorted sets(有序集合) a)和Sets相比,Sorted Sets增加了一個權重引數score,使得集合中的元素能夠按score進行有序排列; b)比如一個儲存全班同學成績的Sorted Sets,其集合value可以是同學的學號,而score就可以是其考試得分,這樣在資料插入集合的時候,就已經進行了天然的排序。可以用Sorted Sets來做帶權重的佇列,比如普通訊息的score為1,重要訊息的score為2,然後工作執行緒可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行。 c)應用場景:線上遊戲的排行榜,根據得分你通常想要: i.列出前100名高分選手 ii.列出某使用者當前的全球排名
5.hashes(雜湊) a)在Memcached中,我們經常將一些結構化的資訊打包成hashmap,在客戶端序列化後儲存為一個字串的值,比如使用者的暱稱、年齡、性別、積分等,這時候在需要修改其中某一項時,通常需要將所有值取出反序列化後,修改某一項的值,再序列化儲存回去。這樣不僅增大了開銷,也不適用於一些可能併發操作的場合(比如兩個併發的操作都需要修改積分)。而Redis的Hash結構可以使你像在資料庫中Update一個屬性一樣只修改某一項屬性值。 b)應用場景:儲存部分變更資料,如使用者資訊,session共享;
分散式 Redis支援主從模式,Master會將資料同步到slave,而slave不會將資料同步到Master。Slave啟動時會連線Master來同步資料 這是一個典型的分散式讀寫分離模型,我們可以利用master來插入資料,slave來提供檢索服務,這樣可以有效的減少單個機器的併發訪問數量。
使用Redis的好處 1、速度快,因為資料是儲存在記憶體中的,類似於HashMap的優勢就是查詢和操作的時間複雜度都是O(1) 2、支援豐富的資料型別,支援String,list,set,sorted set,hash 3、支援事務,操作都是原子性的 4、豐富的特性,可用於快取訊息,按key設定過期時間,過期後自動刪除
注意事項 1、Master最好不要做持久化工作,如果不重寫AOF檔案,這個持久化方式對效能的影響是最小的,因為AOF檔案會不斷增大,過大的話會影響Master的重啟速度。 2、如果資料比較重要,某個Slave開啟AOF備份資料,策略最好每一秒同步一次 3、為了主從複製的速度和連線的穩定性,Master和Slave最好在同一個區域網內 4、儘量避免在壓力很大的主庫上增加從庫 5、主從複製不要用圖狀結構,用單向連結串列更為穩定,即Master<-Slave1<-Slave2<-Slave3…
如何解決Redis的併發競爭問題 Redis為單程序單執行緒模式,採用佇列模式將併發訪問變為序列訪問。Redis本身沒有鎖的概念,Redis對於多個客戶端連線並不存在競爭,但是在Jedis客戶端對Redis進行併發訪問時會發生連線超時、資料轉換錯誤、阻塞、客戶端關閉連線等問題,這些問題均是由於客戶端連線混亂造成。對此有2種解決方法: 1.客戶端角度,為保證每個客戶端間正常有序與Redis進行通訊,對連線進行池化,同時對客戶端讀寫Redis操作採用內部鎖synchronized。 2.伺服器角度,利用setnx實現鎖。 注:對於第一種,需要應用程式自己處理資源的同步,可以使用的方法比較通俗,可以使用synchronized也可以使用lock;第二種需要用到Redis的setnx命令,但是需要注意一些問題。
Redis持久化的幾種方式 1、快照(snapshots) 2、AOF 3、虛擬記憶體方式
Redis最適合的場景 (1)、會話快取(Session Cache) (2)、全頁快取(FPC) (3)、佇列 (4),排行榜/計數器 (5)、釋出/訂閱