網站首頁 編程語言 正文
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
相關推薦
- 2023-07-28 Cannot read properties of undefined (reading ‘push
- 2022-12-02 淺析Tomcat使用線程池配置高并發連接_Tomcat
- 2022-04-05 Python中hash加密簡介及使用方法_python
- 2022-04-22 數組去重并找到所有重復的項的索引位置
- 2021-12-12 Redis實現分布式鎖的實例講解_Redis
- 2023-07-06 css實現高亮模式和黑暗模式
- 2022-06-29 python人工智能tensorflow函數tf.get_variable使用方法_python
- 2023-04-20 Error in mounted hook: “TypeError: Cannot read pro
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支