作為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 雖然提供了rdb
和aof
兩種持久化方式,但是普遍還是認為 redis 的持久化並不是很靠譜。這也是我一直不敢嘗試徹底的用 redis 去實現第五點(好友關係)的原因。
redis使用場景
最近要去面試php程式設計師,去各家招聘 看看,都要有redis方面的知識儲備。這裡寫一篇部落格,就當是對最近學習redis的一次回顧。簡單一句話介紹redis 基於記憶體的高效的key value資料庫,把資料載入到記憶體中進行處理,定期把資料儲存到硬碟進行儲存,單執行緒。redis五大資料型別 ...
redis使用場景
redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在寫龐大的sql上了,而是利用redis靈活多變的資料結構和資料操作來實現。redis常用資料型別 redis最為常用的資料型別主要有以下五種 下面我們先來逐一的分析下這五種資料型別的使用和內部實現方式 ...
Redis使用場景
1 字串使用場景 a 快取功能 典型使用場景 redis作為快取層,mysql作為儲存層,絕大部分請求的資料都是從redis中獲取,由於redis具有支撐高併發的特性,所以快取通常能起到加速讀寫和降低後端壓力的作用。b 計數 c 共享session 典型應用場景 使用者登陸資訊,redis將使用者的...