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!