以下列出11種Web應用場景,在這些場景下可以充分的利用Redis的特性,大大提高效率。
1.在主頁中顯示最新的項目清單。
Redis使用的是常駐記憶體的緩存,速度非常快。 LPUSH用來插入一個內容ID,作為關鍵字儲存在清單頭部。 LTRIM用來限制清單中的項目數最多為5000。如果使用者需要的檢索的資料量超越這個快取容量,這時才需要把請求傳送到資料庫。
2.刪除和過濾。
如果一篇文章被刪除,可以使用LREM從快取中徹底清除掉。
3.排行榜及相關問題。
排行榜(leader board)依照分數進行排序。 ZADD指令可以直接實現這個功能,而ZREVRANGE指令可以用來依照分數來取得前100名的用戶,ZRANK可以用來取得用戶排名,非常直接而且操作容易。
4.依照用戶投票和時間排序。
這就像是Reddit的排行榜,得分會隨著時間變化。 LPUSH和LTRIM指令結合運用,把文章加到一個清單中。一項後台任務用來取得列表,並重新計算列表的排序,ZADD指令用來依照新的順序填入生成列表。列表可以實現非常快速的檢索,即使是負載很重的站點。
5.過期項目處理。
使用unix時間作為關鍵字,用來保持清單能夠按時間排序。對current_time和time_to_live進行檢索,完成尋找過期項目的艱鉅任務。另一項後台任務使用ZRANGE...WITHSCORES進行查詢,刪除過期的項目。
6.計數。
進行各種資料統計的用途是非常廣泛的,例如想知道什麼時候封鎖一個IP位址。 INCRBY指令讓這些變得很容易,透過原子遞增保持計數;GETSET用來重置計數器;過期屬性用來確認一個關鍵字什麼時候應該刪除。
7.特定時間內的特定項目。
這是特定訪客的問題,可以透過給每次頁面瀏覽使用SADD命令來解決。 SADD不會將已經存在的成員加入一個集合。
8.即時分析正在發生的情況,用於數據統計與防止垃圾郵件等。
使用Redis原語指令,更容易實作垃圾郵件過濾系統或其他即時追蹤系統。
9. Pub/Sub。
在更新中保持使用者對資料的對應是系統中的一個普遍任務。 Redis的pub/sub功能使用了SUBSCRIBE、UNSUBSCRIBE和PUBLISH指令,讓這個變得更容易。
10.隊列。
在目前的程式設計中佇列隨處可見。除了push和pop類型的指令之外,Redis還有阻塞佇列的指令,能夠讓一個程式在執行時被另一個程式加入到佇列。你也可以做些更有趣的事情,像是旋轉更新的RSS feed佇列。
11.快取.
Redis快取使用的方式與memcache相同。
網路應用不能無止盡地進行模型的戰爭,看看這些Redis的原語命令,儘管簡單但功能強大,把它們加以組合,所能完成的就更無法想像。當然,你可以專門編寫程式碼來完成所有這些操作,但Redis實作起來顯然更為輕鬆。
毫無疑問,Redis開創了一種新的資料儲存思路,使用Redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用Redis靈活多變的資料結構和資料操作,為不同的大象建造不同的冰箱。希望你喜歡這個比喻。
以下是一篇新鮮出爐的文章,其作者是Redis作者@antirez,他描述了Redis比較適合的一些應用場景,NoSQLFan簡單列舉在這裡,供大家一覽:
例如典型的取你網站的最新文章,透過下面方式,我們可以將最新的5000條評論的ID放在在Redis的List集合中,並將超出集合部分從資料庫取得
使用LPUSH latest.commentseddfa97ffc1dc71769e3f42e462dfe8e指令,向list集合中插入資料
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指令即可。
例如你可以把上面說到的sorted set的score值設定成過期時間的時間戳,那麼就可以簡單地透過過期時間排序,定時清除過期數據了,不僅是清除Redis中的過期數據,你完全可以把Redis裡這個過期時間當成是對資料庫中數據的索引,用Redis來找出哪些數據需要過期刪除,然後再精準地從資料庫中刪除對應的記錄。
Redis的指令都是原子性的,你可以輕鬆地利用INCR,DECR指令來建立計數器系統。
這個使用Redis的set資料結構最適合了,只需要不斷地將資料丟到set就行了, set意為集合,所以會自動排重。
透過上面說到的set功能,你可以知道一個終端使用者是否進行了某個操作,可以找到其操作的集合並進行分析統計對比等。沒有做不到,只有想不到。
Redis的Pub/Sub系統可以建構即時的訊息系統,例如許多用Pub/Sub建構的即時聊天系統的例子。
使用list可以建構佇列系統,使用sorted set甚至可以建構有優先權的佇列系統。
以上是Redis在11種Web應用程式場景下的充分發揮的詳細內容。更多資訊請關注PHP中文網其他相關文章!