標籤:記憶體 使用 網站 home 開發 介紹 清空 設定檔 exe
情境一:類似於微博,實現關注和被關注功能。
思路:
對每個使用者使用兩個集合類型鍵,用來儲存關注別人的使用者和被該使用者關注的使用者。當使用者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會不斷刪除資料庫中最近最少使用的鍵,直到滿足了當前記憶體大小限制
Redis實現緩衝,你應該懂的哪些思路!