Redis的應用場景

2022-06-04 07:27:08 字數 2134 閱讀 7175

作為key-value形態的記憶體資料庫,redis 最先會被想到的應用場景便是作為資料快取。而使用 redis 快取資料非常簡單,只需要通過string型別將序列化後的物件存起來即可,不過也有一些需要注意的地方:

redis 中list的資料結構實現是雙向鍊錶,所以可以非常便捷的應用於訊息佇列(生產者 / 消費者模型)。訊息的生產者只需要通過lpush將訊息放入 list,消費者便可以通過rpop取出該訊息,並且可以保證訊息的有序性。如果需要實現帶有優先順序的訊息佇列也可以選擇sorted set。而pub/sub功能也可以用作發布者 / 訂閱者模型的訊息。無論使用何種方式,由於 redis 擁有持久化功能,也不需要擔心由於伺服器故障導致訊息丟失的情況。

list作為雙向鍊錶,不光可以作為佇列使用。如果將它用作棧便可以成為乙個公用的時間軸。當使用者發完微博後,都通過lpush將它存放在乙個 key 為latest_weibolist中,之後便可以通過lrange取出當前最新的微博。

使用sorted set和乙個計算熱度的演算法便可以輕鬆打造乙個熱度排行榜,zrevrangebyscore可以得到以分數倒序排列的序列,zrank可以得到乙個成員在該排行榜的位置(是分數正序排列時的位置,如果要獲取倒序排列時的位置需要用zcard-zrank)。

計數功能應該是最適合 redis 的使用場景之一了,因為它高頻率讀寫的特徵可以完全發揮 redis 作為記憶體資料庫的高效。在 redis 的資料結構中,stringhashsorted set都提供了incr方法用於原子性的自增操作,下面舉例說明一下它們各自的使用場景:

這個場景最開始是是一篇介紹微博 redis 應用的 ppt 中看到的,其中提到微博的 redis 主要是用在在計數和好友關係兩方面上,當時對好友關係方面的用法不太了解,後來看到《redis 設計與實現》中介紹到作者最開始去使用 redis 便是希望能通過set解決傳統資料庫無法快速計算集合中交集這個功能。後來聯想到微博當前的業務場景,確實能夠以這種方式實現,所以姑且猜測一下:

對於乙個使用者 a,將它的關注和粉絲的使用者 id 都存放在兩個 set 中:

在 redis 2.6.12 版本開始,stringset命令增加了一些引數:

ex:設定鍵的過期時間(單位為秒)

px:設定鍵的過期時間(單位為毫秒)

nx:只在鍵不存在時,才對鍵進行設定操作。set key value nx

效果等同於setnx key value

xx:只在鍵已經存在時,才對鍵進行設定操作。

由於這個操作是原子性的,可以簡單地以此實現乙個分布式的鎖,例如:

set key "lock" nx ex 1

如果這個操作返回false,說明 key 的新增不成功,也就是當前有人在占用這把鎖。而如果返回true,則說明得了鎖,便可以繼續進行操作,並且在操作後通過del命令釋放掉鎖。並且即使程式因為某些原因並沒有釋放鎖,由於設定了過期時間,該鎖也會在 1 秒後自動釋放,不會影響到其他程式的執行。

倒排索引是構造搜尋功能的最常見方式,在 redis 中也可以通過set進行建立倒排索引,這裡以簡單的拼音 + 字首搜尋城市功能舉例:

顯示最新的專案列表

lpush latest.comments

在redis中我們的最新id使用了常駐快取,這是一直更新的。但是我們做了限制不能超過5000個id,因此我們的獲取id函式會一直詢問redis。只有在超出了這個範圍的時候,才需要去訪問資料庫。

參考:

Redis應用場景

redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...

Redis應用場景

redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...

Redis應用場景

閱讀 31,232 次 毫無疑問,redis 開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。希望你喜歡這個比喻。下面是一篇新鮮出爐的文章,其作者是re...