Redis實現快取,你應該懂的哪些思路!

2022-07-22 05:15:11 字數 1658 閱讀 6768

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

思路:對每個使用者使用兩個集合型別鍵,用來儲存關注別人的使用者和被該使用者關注的使用者。當使用者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之(十一)redis實現快取的功能

一 redis實現快取的原理 利用鍵的失效時間設定實現快取技術 由於redis的記憶體有限,可以在redis的配置檔案裡設定maxmemory的引數。來限制redis最大可用記憶體的大小。單位是位元組 當超出這個限制的時候,redis可以依據maxmemory policy引數指定的策略來刪除不需要...

你應該知道的Redis過期鍵和過期策略

如何設定過期鍵 如何取消設定的過期時間 過期鍵的過期策略是怎樣的 rdb aof 和複製對過期鍵的處理又是怎樣的 redis 一共有 4 個命令來設定鍵的生存時間 可以存活多久 或過期時間 什麼時候被刪除 上述四種命令本質上都是通過 pexpireat 命令來實現的。例子 127.0.0.1 637...

redis快取技術實現導航欄的維護

redis是乙個開源的使用ansi c語言編寫的 支援網路 基於記憶體的 支援持久化的日誌型 key value資料庫。從如此豐富的修飾語中,我們基本可以抽離出這些資訊 今天用redis實現導航欄的維護 在自己電腦上使用時,每次用redis技術需要啟動他的伺服器 redis server.exe 下...