標籤:
最近在看redis入門指南,現在就自己的學習情況說說自己的理解。
字串類型(String)
字串類型是Redis中最基本的類型,能儲存任意形式的字串,包括位元據。如一張照片也可以用字串類型儲存。注意字串類型鍵允許儲存的資料最大容量是512M。
Strings 資料結構是簡單的key-value類型,value其實不僅是String,也可以是數字。除了get、set、incr、decr 等操作外,Redis還提供了下面一些操作:
擷取字串長度;
往字串append內容;
設定和擷取字串的某一段內容;
設定及擷取字串的某一位(bit);
大量設定一系列字串的內容;
所以字串類型用來儲存字串和計數都是非常方便的。就拿一篇部落格來說:實現文章訪問量的統計、產生自增ID、被評論多少次,轉寄多少次,贊多少次,被瀏覽多少次,有多少個好友等等同時包括儲存文章的內容都只需要使用字串類型便可以實現。
散列類型(hash)
散列就是hash,散列類型用於儲存比如使用者的暱稱、年齡、性別、積分等是非常方便的,都能實現只有O(1)的複雜度。同時對這些內容的修改也會非常方便。
就比如:關聯式資料庫中如果要儲存汽車對象,儲存結構如下表所示:
如果想為 ID 為 1 的汽車增加生產日期屬性,就需要把資料表更改為如下表所示的結構:
對於 ID 為 2 和 3 的兩條記錄而言 date 欄位是冗餘的。可想而知當不同的記錄需要不同的屬性時,表的欄位數量會越來越多以至於難以維護。
但是在redis中就沒有這樣的情況。當然redis在我看來也會形成很大的浪費,就像上面的例子:如果汽車的數量太多的話,那每一輛車都有一個color、name、price這些字元需要去儲存,雖然後面有精簡鍵名的方法那也是很浪費啊。
其實還有一個疑問:redis上面列舉的例子都是一層關聯式模式,那多層的時候redis是將多層進行分解嗎?
清單類型(list)
list是用鏈表實現的,而且是雙向鏈表。這樣的話很顯而易見的就是在兩端插入和刪除是非常方便的O(1),所以list提供的操作基本操作lpush、rpush、lpop、rpop。
同時不難看出list很容易實現棧和隊列。
基於上面的這些原因:list主要運用於取最新N個資料的操作,如社交網站上的新鮮事,最新的新聞,最新更新的部落格這些使用list實現可以事半功倍。
有個問題一直想不清楚:書上說列表是有序的字串列表,所謂的有序難道是push 時間的先後嗎??
集合類型
集合我們首先應該注意到的是:儲存不重複的鍵,注意不重複也就是唯一的意思。
我們也應該注意到集合是用值為空白的散列表實現的,呵呵,那麼其實他實現不重複的原理其實就是使用了散列表(hash)的索引值(key)唯一的特性。
既然他是一種特殊形式的散列表,那麼散列錶快速訪問——O(1)的特性同樣存在與集合之中。所以訪問集合的時間複雜度就是O(1)咯。
好了我們來看看集合主要用在一些什麼地方呢?
uniq的特性——Uniq操作,擷取某段時間所有資料排重值;
簡單粗暴的並交叉操作——比如在微博應用中,可以將一個使用者所有的關注人存在一個集合中,將其所有粉絲存在一個集合。Redis為集合提供了求交集、並集、差集等操作,可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給用戶端還是存集到一個新的集合中;
有序集合
有序集合是按照某種分數的高低來排序。
有序集合是利用散列表和跳躍表來實現的。
主要運用:比如一個儲存全班同學成績的Sorted Sets,其集合value可以是同學的學號,而score就可以是其考試得分,這樣在資料插入集合的時候,就已經進行了天然的排序。這就是:熱門排行榜應用,取TOP N操作。
另外還可以用Sorted Sets來做帶權重的隊列,比如普通訊息的score為1,重要訊息的score為2,然後背景工作執行緒可以選擇按score的倒序來擷取工作任務,讓重要的任務優先執行。這就是傳說中的:構建有優先順序的隊列系統。
需要精準設定到期時間的應用——如你可以把上面說到的sorted set的score值設定成到期時間的時間戳記,那麼就可以簡單地通過到期時間排序,定時清除到期資料了,不僅是清除Redis中的到期資料,你完全可以把Redis裡這個到期時間當成是對資料庫中資料的索引,用Redis來找出哪些資料需要到期刪除,然後再精準地從資料庫中刪除相應的記錄。
其他的
Pub/Sub構建即時訊息系統——Redis的Pub/Sub系統可以構建即時的訊息系統,比如很多用Pub/Sub構建的即時聊天系統的例子,我覺得qq訊息裡面@all就可以用這個實現;
其他的比較高大上的運用的話你不妨參考:http://www.csdn.net/article/1970-01-01/2817107
redis學習筆記——應用情境