最近在看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