作為key-value
形態的記憶體資料庫,redis 最先會被想到的應用場景便是作為資料快取。而使用 redis 快取資料非常簡單,只需要通過string
型別將序列化後的物件存起來即可,不過也有一些需要注意的地方:
redis 中list
的資料結構實現是雙向鍊錶,所以可以非常便捷的應用於訊息佇列(生產者 / 消費者模型)。訊息的生產者只需要通過lpush
將訊息放入 list,消費者便可以通過rpop
取出該訊息,並且可以保證訊息的有序性。如果需要實現帶有優先順序的訊息佇列也可以選擇sorted set
。而pub/sub
功能也可以用作發布者 / 訂閱者模型的訊息。無論使用何種方式,由於 redis 擁有持久化功能,也不需要擔心由於伺服器故障導致訊息丟失的情況。
list
作為雙向鍊錶,不光可以作為佇列使用。如果將它用作棧便可以成為乙個公用的時間軸。當使用者發完微博後,都通過lpush
將它存放在乙個 key 為latest_weibo
的list
中,之後便可以通過lrange
取出當前最新的微博。
使用sorted set
和乙個計算熱度的演算法便可以輕鬆打造乙個熱度排行榜,zrevrangebyscore
可以得到以分數倒序排列的序列,zrank
可以得到乙個成員在該排行榜的位置(是分數正序排列時的位置,如果要獲取倒序排列時的位置需要用zcard
-zrank
)。
計數功能應該是最適合 redis 的使用場景之一了,因為它高頻率讀寫的特徵可以完全發揮 redis 作為記憶體資料庫的高效。在 redis 的資料結構中,string
、hash
和sorted set
都提供了incr
方法用於原子性的自增操作,下面舉例說明一下它們各自的使用場景:
這個場景最開始是是一篇介紹微博 redis 應用的 ppt 中看到的,其中提到微博的 redis 主要是用在在計數和好友關係兩方面上,當時對好友關係方面的用法不太了解,後來看到《redis 設計與實現》中介紹到作者最開始去使用 redis 便是希望能通過set
解決傳統資料庫無法快速計算集合中交集這個功能。後來聯想到微博當前的業務場景,確實能夠以這種方式實現,所以姑且猜測一下:
對於乙個使用者 a,將它的關注和粉絲的使用者 id 都存放在兩個 set 中:
在 redis 2.6.12 版本開始,string
的set
命令增加了三個引數:
set key "lock" ex 1 xx
如果這個操作返回false
,說明 key 的新增不成功,也就是當前有人在占用這把鎖。而如果返回true
,則說明得了鎖,便可以繼續進行操作,並且在操作後通過del
命令釋放掉鎖。並且即使程式因為某些原因並沒有釋放鎖,由於設定了過期時間,該鎖也會在 1 秒後自動釋放,不會影響到其他程式的執行。
倒排索引是構造搜尋功能的最常見方式,在 redis 中也可以通過set
進行建立倒排索引,這裡以簡單的拼音 + 字首搜尋城市功能舉例:
Redis應用場景
redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...
Redis應用場景
redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...
Redis應用場景
閱讀 31,232 次 毫無疑問,redis 開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。希望你喜歡這個比喻。下面是一篇新鮮出爐的文章,其作者是re...