首頁 > 軟體

Redis深入瞭解記憶體淘汰與事務操作

2022-07-28 14:03:45

Redis記憶體淘汰策略

為什麼要有淘汰策略?

答:將Redis用作快取時,Redis資料存在記憶體中,如果記憶體空間用滿,就會自動驅逐老的資料。

redis組態檔:可以設定redis存放資料的閾值(例如:100mb),再設定淘汰策略。

六種淘汰策略

  • noeviction:當記憶體使用達到閾值的時候,所有引起申請記憶體的命令會報錯。
  • allkeys-lru:在主鍵空間中,優先移除最近未使用的key。(推薦)
  • volatile-lru:在設定了過期時間的鍵空間中,優先移除最近未使用的key。
  • allkeys-random:在主鍵空間中,隨機移除某個key。
  • volatile-random:在設定了過期時間的鍵空間中,隨機移除某個key。
  • volatile-ttl:在設定了過期時間的鍵空間中,具有更早過期時間的key優先移除。

如何設定淘汰策略?

在redis.conf檔案中, 設定Redis 記憶體大小的限制,我們可以設定maxmemory ,當資料達到限定大小後,會選擇設定的策略淘汰資料。

比如:maxmemory 300mb。

通過設定 maxmemory-policy 設定Redis的淘汰策略。比如:maxmemory-policy volatile-lru

Redis中的自動過期機制

首先需要設定redis組態檔,開啟 key 失效監聽。

當key失效時,可以執行我們的使用者端回撥監聽的方法。

需要在Redis中設定:notify-keyspace-events “Ex”

程式碼在之前的基礎上增加:Springboot整合key失效監聽

RedisListenerConfig 設定類

@Configuration
public class RedisListenerConfig {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}

監聽 key 的類

@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String expiraKey = message.toString();
        System.out.println("失效的key:" + expiraKey);
    }
}

注意:如果是多個springboot專案或者多個 jvm 服務監聽同一個key的話,每一個 jvm 都會監聽到這個key失效並且執行相應的邏輯程式碼。

多服務(jvm)監聽Redis key失效通知,如何保證只有一個jvm是執行監聽的程式碼?

答:可以使用 zookeeper 的選舉機制,多個服務註冊到zookeeper中,選舉出一個leader,由為 leader 的jvm來執行監聽程式碼。

Redis中的事務操作

  • Multi 開啟事務
  • EXEC 提交事務
  • Watch 可以監聽一個或者多個key,在提交事務之前是否有發生了變化 如果發生邊了變化就不會提交事務,沒有發生變化才可以提交事務 版本號碼 樂觀鎖
  • Discard 取消提交事務

注意:Redis官方是沒有提供回滾方法,只提供了取消事務。

Redis中本身就是單執行緒的能夠保證執行緒安全問題,不需要考慮執行緒安全問題。

取消事務跟回滾有什麼區別呢?為什麼redis不支援回滾事務?

Mysql中開啟了事務,對該行資料上行鎖—,Commit 資料可以提交

回滾:對事務取消和行鎖都會復原

Redis沒有回滾事務的概念,單純取消事務(不提交事務) 不上鎖

watch和Multi的區別

Watch相當於樂觀鎖,在事務提交之前沒有發生變化才可以提交事務。

Multi 就是開啟事務,運算元據之後可以提交事務或者取消提交事務。

到此這篇關於Redis深入瞭解記憶體淘汰與事務操作的文章就介紹到這了,更多相關Redis記憶體淘汰與事務操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com