1. 程式人生 > >[轉]Redis實現緩存,你應該懂的哪些思路!

[轉]Redis實現緩存,你應該懂的哪些思路!

校驗 mem img /etc 元素 內存 大小 cfb bre

場景一:類似於微博,實現關註和被關註功能。

思路:

對每個用戶使用兩個集合類型鍵,用來存儲關註別人的用戶和被該用戶關註的用戶。當用戶A關註用戶B的時候,執行兩步操作:

sadd user:A B

sadd user:B A

問題1:

完成一次用戶關註操作,需要執行兩步代碼,第一次實現用戶A關註B,成為了B的粉絲。而第二步的時候,因為某種原因沒有執行或執行成功,則A並不知道B關註了自己

事務:

事務的原理是,先將一個事務的命令發送給Redis,然後再讓Redis依次執行這些命令。

一個事務中,要麽都執行成功,要麽都不執行

技術分享圖片

multi命令告訴redis準備介紹事務,先暫存起來,不要執行。然後發送需要一起執行的命令,最後exec結束事務,redis依次執行那麽命令

如果在執行exec命令之前,因為某種原因,redis斷掉了,Redis會清空事務隊列.

問題2:

有些時候,我們不僅需要通過事務來處理一些必須一起成功的動作,比如銀行轉賬,從銀行卡1轉出錢到銀行卡2,必須是都一起成功,不能說從銀行卡1中扣完錢之後,沒有進到銀行卡2賬上,兩者動作比如都要完成。還有些時候,我們既要一起完成,也需要根據其中一步操作的結果來進行下一步操作

WATCH命令

watch,事務中的另一個命令。監控一個或多個鍵,一旦其中一個鍵被修改或刪除,之後的事務就不會執行,一直到exec結束。

技術分享圖片

通過watch監控key1,之後修改了key1,所以事務中的set命令並沒有執行

場景二:限時活動,緩存,驗證碼失效

在實際開發中,經常會遇到限時活動,郵箱失效時間,驗證碼失效時間等場景,這些數據需要在一定的時間內有效,過期刪除,如果在關系型數據庫中保存這些數據,每次校驗都需要查詢數據,對比時間,然後將數據置為失效,或者刪除。而在Redis中,則可以通過expire設置失效時間,自動刪除。

技術分享圖片

expire設置失效時間,時間單位秒。成功返回1,如果key不存在返回0

技術分享圖片

當 key 不存在時,返回 -2 。 當 key 存在但沒有設置剩余生存時間時,返回 -1 。

註意:在 Redis 2.8 以前,當 key 不存在,或者 key 沒有設置剩余生存時間時,命令都返回 -1

實現緩存

為了提供網站的負載能力,需要將一個訪問頻路較高,且經過復雜計算或者IO資源消耗較大的操作的結果緩存起來,並設置一個失效時間。每次用戶訪問的時候,先檢查該鍵是否存在,如果存在直接獲取該元素並返回,如果不存在,則經過一系列計算並將結果緩存,設置失效時間,在返回給用戶

問題:

這種緩存的實現,顯然會有兩個問題,第一個是緩存都是存在內容中的,如果大量的使用緩存會導致Redis沾滿內存,另一方面,為了防止Redis沾滿內存而設置失效時間的鍵,如果設置時間太短,就可能導致緩存命中率過低並且大量內容白白浪費。

使用方式:

在開發中,很難合理的設置鍵的生存時間,所以可以限制Redis使用的最大內存,並讓Redis按照一定規則刪除一些不需要的鍵。

具體方式,修改配置文件的maxmemory參數

技術分享圖片

OS X下通過Homebrew安裝的redis的話,配置文件在/usr/local/etc/redis.conf

限制Redis最大內存之後,當超出了這個內存,會根據maxmemory-policy

技術分享圖片

指定的參數刪除不需要的鍵。當設置此參數為allkeys-lru,一旦Redis內存超過了限制值時,Redis會不斷刪除數據庫中最近最少使用的鍵,直到滿足了當前內存大小限制

轉載鏈接:https://www.cnblogs.com/simengphp/p/6261684.html

[轉]Redis實現緩存,你應該懂的哪些思路!