毫無疑問,Redis開創了一種新的數據存儲思路,使用Redis,咱們不用在面對功能單調的數據庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用Redis靈活多變的數據結構和數據操做,爲不一樣的大象構建不一樣的冰箱。但願你喜歡這個比喻。redis
下面是一篇新鮮出爐的文章,其做者是Redis做者@antirez,他描述了Redis比較適合的一些應用場景,NoSQLFan簡單列舉在這裏,供你們一覽:sql
好比典型的取你網站的最新文章,經過下面方式,咱們能夠將最新的5000條評論的ID放在Redis的List集合中,並將超出集合部分從數據庫獲取數據庫
使用LPUSH latest.comments<ID>命令,向list集合中插入數據編程
插入完成後再用LTRIM latest.comments 0 5000命令使其永遠只保存最近5000個ID設計模式
而後咱們在客戶端獲取某一頁評論時能夠用下面的邏輯(僞代碼)緩存
FUNCTION get_latest_comments(start,num_items): id_list = redis.lrange("latest.comments",start,start+num_items-1) IF id_list.length < num_items id_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...") END RETURN id_list END
若是你還有不一樣的篩選維度,好比某個分類的最新N條,那麼你能夠再建一個按此分類的List,只存ID的話,Redis是很是高效的。數據結構
這個需求與上面需求的不一樣之處在於,前面操做以時間爲權重,這個是以某個條件爲權重,好比按頂的次數排序,這時候就須要咱們的sorted set出馬了,將你要排序的值設置成sorted set的score,將具體的數據設置成相應的value,每次只須要執行一條ZADD命令便可。nosql
好比你能夠把上面說到的sorted set的score值設置成過時時間的時間戳,那麼就能夠簡單地經過過時時間排序,定時清除過時數據了,不只是清除Redis中的過時數據,你徹底能夠把 Redis裏這個過時時間當成是對數據庫中數據的索引,用Redis來找出哪些數據須要過時刪除,而後再精準地從數據庫中刪除相應的記錄。性能
Redis的命令都是原子性的,你能夠輕鬆地利用INCR,DECR命令來構建計數器系統。網站
這個使用Redis的set數據結構最合適了,只須要不斷地將數據往set中扔就好了,set意爲集合,因此會自動排重。
經過上面說到的set功能,你能夠知道一個終端用戶是否進行了某個操做,能夠找到其操做的集合並進行分析統計對比等。沒有作不到,只有想不到。
Redis的Pub/Sub系統能夠構建實時的消息系統,好比不少用Pub/Sub構建的實時聊天系統的例子。
使用list能夠構建隊列系統,使用sorted set甚至能夠構建有優先級的隊列系統。
這個沒必要說了,性能優於Memcached,數據結構更多樣化。
1.在主頁中顯示最新的項目列表。
Redis使用的是常駐內存的緩存,速度很是快。LPUSH用來插入一個內容ID,做爲關鍵字存儲在列表頭部。LTRIM用來限制列表中的項目數最多爲5000。若是用戶須要的檢索的數據量超越這個緩存容量,這時才須要把請求發送到數據庫。
list:
lpush + ltrim //$r->lTrim($key,0,4999);
2.刪除和過濾。
若是一篇文章被刪除,可使用LREM從緩存中完全清除掉。
list:
$r->lRem($key,'find_id',-2);/從右邊刪除2個value爲find_id的元素
3.排行榜及相關問題。
排行榜(leader board)按照得分進行排序。ZADD命令能夠直接實現這個功能,而ZREVRANGE命令能夠用來按照得分來獲取前100名的用戶,ZRANK能夠用來獲取用戶排名,很是直接並且操做容易。
zset:
zadd z1 100 aaa
zrevrange z1 0 -1 withscores 分數從大到小
zrank z1 aaa 分數從小到大 返回aaa的排名
zincrby z1 5 111 給值爲111的元素的score 加5
4.按照用戶投票和時間排序。
這就像Reddit的排行榜,得分會隨着時間變化。LPUSH和LTRIM命令結合運用,把文章添加到一個列表中。一項後臺任務用來獲取列表,並從新計算列表的排序,ZADD命令用來按照新的順序填充生成列表。列表能夠實現很是快速的檢索,即便是負載很重的站點。
list:
lpush ltrim
zset:
zadd
5.過時項目處理。
使用unix時間做爲關鍵字,用來保持列表可以按時間排序。對current_time和time_to_live進行檢索,完成查找過時項目的艱鉅任務。另外一項後臺任務使用ZRANGE...WITHSCORES進行查詢,刪除過時的條目。
zset:把時間做爲score值
zrange z1 0 -1 withscores 分數從小到大
zrangebyscore z1 過時時間戳) +inf 有效條目
6.計數。
進行各類數據統計的用途是很是普遍的,好比想知道何時封鎖一個IP地址。INCRBY命令讓這些變得很容易,經過原子遞增保持計數;GETSET用來重置計數器;過時屬性用來確認一個關鍵字何時應該刪除。
string:
incr、incrby
設計模式:
GETSET能夠和INCR組合使用,實現一個有原子性(atomic)復位操做的計數器(counter)。
舉例來講,每次當某個事件發生時,進程可能對一個名爲mycount的key調用INCR操做,一般咱們還要在一個原子時間內同時完成得到計數器的值和將計數器值復位爲0兩個操做。
能夠用命令GETSET mycounter 0來實現這一目標。
redis> INCR mycount
(integer) 11
redis> GETSET mycount 0 # 一個原子內完成GET mycount和SET mycount 0操做
"11"
redis> GET mycount
"0"
7.特定時間內的特定項目。
這是特定訪問者的問題,能夠經過給每次頁面瀏覽使用SADD命令來解決。SADD不會將已經存在的成員添加到一個集合。
set:
sadd
8.實時分析正在發生的狀況,用於數據統計與防止垃圾郵件等。
使用Redis原語命令,更容易實施垃圾郵件過濾系統或其餘實時跟蹤系統。
阻塞式命令。
bpoplpush
9.Pub/Sub。
在更新中保持用戶對數據的映射是系統中的一個廣泛任務。Redis的pub/sub功能使用了SUBSCRIBE、UNSUBSCRIBE和PUBLISH命令,讓這個變得更加容易。
subscribe xx //阻塞方式
publish xx 123
10.隊列。
在當前的編程中隊列隨處可見。除了push和pop類型的命令以外,Redis還有阻塞隊列的命令,可以讓一個程序在執行時被另外一個程序添加到隊列。你也能夠作些更有趣的事情,好比一個旋轉更新的RSS feed隊列。
list:
入隊列lpush、
出隊列rpop或rpoplpush(計劃任務失敗補發)
11.緩存。
Redis緩存使用的方式與memcache相同。
string:
set、setnx、setex