Redis深入瞭解內存淘汰與事務操作

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內存淘汰與事務操作內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: