日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

作者:kaico2018 ? 更新時間: 2022-09-20 編程語言

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 就是開啟事務,操作數據之后可以提交事務或者取消提交事務。

原文鏈接:https://blog.csdn.net/weixin_44044929/article/details/125354734

欄目分類
最近更新