Redis深入了解內(nèi)存淘汰與事務(wù)操作
Redis內(nèi)存淘汰策略
為什么要有淘汰策略?
答:將Redis用作緩存時(shí),Redis數(shù)據(jù)存在內(nèi)存中,如果內(nèi)存空間用滿(mǎn),就會(huì)自動(dòng)驅(qū)逐老的數(shù)據(jù)。
redis配置文件:可以配置redis存放數(shù)據(jù)的閾值(例如:100mb),再配置淘汰策略。
六種淘汰策略
- noeviction:當(dāng)內(nèi)存使用達(dá)到閾值的時(shí)候,所有引起申請(qǐng)內(nèi)存的命令會(huì)報(bào)錯(cuò)。
- allkeys-lru:在主鍵空間中,優(yōu)先移除最近未使用的key。(推薦)
- volatile-lru:在設(shè)置了過(guò)期時(shí)間的鍵空間中,優(yōu)先移除最近未使用的key。
- allkeys-random:在主鍵空間中,隨機(jī)移除某個(gè)key。
- volatile-random:在設(shè)置了過(guò)期時(shí)間的鍵空間中,隨機(jī)移除某個(gè)key。
- volatile-ttl:在設(shè)置了過(guò)期時(shí)間的鍵空間中,具有更早過(guò)期時(shí)間的key優(yōu)先移除。
如何配置淘汰策略?
在redis.conf文件中, 設(shè)置Redis 內(nèi)存大小的限制,我們可以設(shè)置maxmemory ,當(dāng)數(shù)據(jù)達(dá)到限定大小后,會(huì)選擇配置的策略淘汰數(shù)據(jù)。
比如:maxmemory 300mb。

通過(guò)配置 maxmemory-policy 設(shè)置Redis的淘汰策略。比如:maxmemory-policy volatile-lru

Redis中的自動(dòng)過(guò)期機(jī)制
首先需要配置redis配置文件,開(kāi)啟 key 失效監(jiān)聽(tīng)。
當(dāng)key失效時(shí),可以執(zhí)行我們的客戶(hù)端回調(diào)監(jiān)聽(tīng)的方法。
需要在Redis中配置:notify-keyspace-events “Ex”
代碼在之前的基礎(chǔ)上增加:Springboot整合key失效監(jiān)聽(tīng)
RedisListenerConfig 配置類(lèi)
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}監(jiān)聽(tīng) key 的類(lèi)
@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);
}
}注意:如果是多個(gè)springboot項(xiàng)目或者多個(gè) jvm 服務(wù)監(jiān)聽(tīng)同一個(gè)key的話(huà),每一個(gè) jvm 都會(huì)監(jiān)聽(tīng)到這個(gè)key失效并且執(zhí)行相應(yīng)的邏輯代碼。
多服務(wù)(jvm)監(jiān)聽(tīng)Redis key失效通知,如何保證只有一個(gè)jvm是執(zhí)行監(jiān)聽(tīng)的代碼?
答:可以使用 zookeeper 的選舉機(jī)制,多個(gè)服務(wù)注冊(cè)到zookeeper中,選舉出一個(gè)leader,由為 leader 的jvm來(lái)執(zhí)行監(jiān)聽(tīng)代碼。
Redis中的事務(wù)操作
- Multi 開(kāi)啟事務(wù)
- EXEC 提交事務(wù)
- Watch 可以監(jiān)聽(tīng)一個(gè)或者多個(gè)key,在提交事務(wù)之前是否有發(fā)生了變化 如果發(fā)生邊了變化就不會(huì)提交事務(wù),沒(méi)有發(fā)生變化才可以提交事務(wù) 版本號(hào)碼 樂(lè)觀鎖
- Discard 取消提交事務(wù)
注意:Redis官方是沒(méi)有提供回滾方法,只提供了取消事務(wù)。
Redis中本身就是單線(xiàn)程的能夠保證線(xiàn)程安全問(wèn)題,不需要考慮線(xiàn)程安全問(wèn)題。
取消事務(wù)跟回滾有什么區(qū)別呢?為什么redis不支持回滾事務(wù)?
Mysql中開(kāi)啟了事務(wù),對(duì)該行數(shù)據(jù)上行鎖—,Commit 數(shù)據(jù)可以提交
回滾:對(duì)事務(wù)取消和行鎖都會(huì)撤銷(xiāo)
Redis沒(méi)有回滾事務(wù)的概念,單純?nèi)∠聞?wù)(不提交事務(wù)) 不上鎖
watch和Multi的區(qū)別
Watch相當(dāng)于樂(lè)觀鎖,在事務(wù)提交之前沒(méi)有發(fā)生變化才可以提交事務(wù)。
Multi 就是開(kāi)啟事務(wù),操作數(shù)據(jù)之后可以提交事務(wù)或者取消提交事務(wù)。
到此這篇關(guān)于Redis深入了解內(nèi)存淘汰與事務(wù)操作的文章就介紹到這了,更多相關(guān)Redis內(nèi)存淘汰與事務(wù)操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ubuntu22.04 LTS 上安裝Redis的過(guò)程
Redis是一種開(kāi)源的內(nèi)存數(shù)據(jù)存儲(chǔ),可以用作數(shù)據(jù)庫(kù)、緩存和消息代理等,本文將會(huì)介紹兩種不同的安裝方式,包括從源代碼編譯安裝以及通過(guò)apt包管理器安裝,需要的朋友參考下吧2023-11-11
Redis 對(duì)比 Memcached 并在 CentOS 下進(jìn)行安裝配置詳解
Redis 是一個(gè)開(kāi)源、支持網(wǎng)絡(luò)、基于內(nèi)存、鍵值對(duì)的 Key-Value 數(shù)據(jù)庫(kù),本篇文章主要介紹了Redis 對(duì)比 Memcached 并在 CentOS 下進(jìn)行安裝配置詳解,有興趣的可以了解一下。2016-11-11
手把手教你用Redis 實(shí)現(xiàn)點(diǎn)贊功能并且與數(shù)據(jù)庫(kù)同步
本文主要介紹了Redis 實(shí)現(xiàn)點(diǎn)贊功能并且與數(shù)據(jù)庫(kù)同步,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Redisson如何解決Redis分布式鎖提前釋放問(wèn)題
本文主要介紹了Redisson如何解決Redis分布式鎖提前釋放問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
redis?Template.opsForValue()中方法實(shí)例詳解
這篇文章主要介紹了redis?Template.opsForValue()中方法講解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
基于Redis6.2.6版本部署Redis?Cluster集群的問(wèn)題
這篇文章主要介紹了基于Redis6.2.6版本部署Redis?Cluster集群,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
Redis實(shí)現(xiàn)編碼生成規(guī)則方式
在自動(dòng)生成編碼時(shí)應(yīng)采用“MD+年月日+4位序列號(hào)”的規(guī)則,如“MD202310130001”,為避免使用隨機(jī)序列號(hào)導(dǎo)致的重復(fù)編碼,建議使用從0開(kāi)始的自增序列號(hào),此外,使用Redis的incrBy功能實(shí)現(xiàn)序列號(hào)自增,可以有效提高效率和降低實(shí)現(xiàn)難度2023-01-01

