最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何監(jiān)聽Redis中Key值的變化(SpringBoot整合)

 更新時(shí)間:2024年03月29日 08:48:00   作者:Z灝  
測試過程中我們有一部分常量值放入redis,共大部分應(yīng)用調(diào)用,但在測試過程中經(jīng)常有人會清空redis,回歸測試,下面這篇文章主要給大家介紹了關(guān)于如何監(jiān)聽Redis中Key值變化的相關(guān)資料,需要的朋友可以參考下

一、概念

當(dāng)Redis中的值發(fā)生改變時(shí),通過配置來監(jiān)聽key值的變化。

事件通過 Redis 的訂閱與發(fā)布功能(pub/sub)來進(jìn)行分發(fā), 因此所有支持訂閱與發(fā)布功能的客戶端都可以在無須做任何修改的情況下, 直接使用鍵空間通知功能。

二、配置

因?yàn)殚_啟鍵空間通知功能需要消耗一些 CPU , 所以在默認(rèn)配置下, 該功能處于關(guān)閉狀態(tài)。

可以通過修改 redis.conf 文件, 或者直接使用 CONFIG SET 命令來開啟或關(guān)閉鍵空間通知功能。
notify-keyspace-events 的參數(shù)可以是以下字符的任意組合, 它指定了服務(wù)器該發(fā)送哪些類型的通知:

第一種方式:直接使用命令

第一步:開啟

config set notify-keyspace-events KEA

第二步:訂閱

另起一個(gè)窗口,用于監(jiān)聽。

psubscribe '__key*__:*'                   #對所有庫鍵空間通知
psubscribe '__keyspace@5__:*'             #是對db5數(shù)據(jù)庫鍵空間通知
psubscribe '__keyspace@5__:order*'        #是對db5數(shù)據(jù)庫,key前綴為order所有鍵的鍵空間通知

出現(xiàn)以上形式表明訂閱成功。

第三步:添加數(shù)據(jù)

set k1 v1

這就是配置成功了。

【推薦】第二種方式:修改配置文件

如果使用第一種方式的話,當(dāng)關(guān)閉窗口時(shí),再次使用的話,還需要重新輸入,而修改配置文件則不用重復(fù)操作。

第一步:找配置文件

在安裝的路徑中找到redis.windows.conf

點(diǎn)擊快捷鍵"ctrl+F",輸入:notify-keyspace-events

第二步:修改配置文件

改為:notify-keyspace-events KEA

點(diǎn)擊"ctrl+S"保存并關(guān)閉

第三步:使用命令啟動(dòng)Redis

將Redis注冊成一個(gè)服務(wù)啟動(dòng),這樣就不用每次開機(jī)手動(dòng)啟動(dòng)了,而且不用一直用黑窗口打開了。

找到Redis的安裝路徑,然后進(jìn)入,輸入cmd

輸入命令:

redis-server.exe --service-install redis.windows.conf 

這樣在服務(wù)中就可以找到了。

三、整合SpringBoot

1.加入依賴

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.配置文件

spring:
    redis:
        # Redis服務(wù)器地址
        host: 127.0.0.1
        # Redis服務(wù)器端口號
        port: 6379
        # 使用的數(shù)據(jù)庫索引,默認(rèn)是0
        database: 0
        # 連接超時(shí)時(shí)間
        timeout: 1800000
        # 設(shè)置密碼
        password: 
        lettuce:
            pool:
                # 最大阻塞等待時(shí)間,負(fù)數(shù)表示沒有限制
                max-wait: -1
                # 連接池中的最大空閑連接
                max-idle: 5
                # 連接池中的最小空閑連接
                min-idle: 0
                # 連接池中最大連接數(shù),負(fù)數(shù)表示沒有限制
                max-active: 20

3.配置類

package com.redisDemo.config;

import com.example.redisDemo.controller.RedisReceiver;
import com.example.redisDemo.listener.*;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.net.UnknownHostException;

/**
 * @author lenovo
 */
@Configuration
public class RedisConfig {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Autowired
    private RedisUpdateAndAddListener redisUpdateAndAddListener;

    @Autowired
    private RedisDeleteListener redisDeleteListener;

    @Autowired
    private RedisHashUpdateAndAddListener redisHashUpdateAndAddListener;

    @Autowired
    private RedisListUpdateAndAddListener redisListUpdateAndAddListener;

    @Autowired
    private RedisSetUpdateAndAddListener redisSetUpdateAndAddListener;

    @Autowired
    private RedisSortUpdateAndAddListener redisSortUpdateAndAddListener;


    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //監(jiān)聽所有的key的set事件
        container.addMessageListener(redisUpdateAndAddListener, redisUpdateAndAddListener.getTopic());
        //監(jiān)聽所有key的刪除事件
        container.addMessageListener(redisDeleteListener,redisDeleteListener.getTopic());
        container.addMessageListener(redisHashUpdateAndAddListener,redisHashUpdateAndAddListener.getTopic());
        container.addMessageListener(redisListUpdateAndAddListener,redisListUpdateAndAddListener.getTopic());
        container.addMessageListener(redisSetUpdateAndAddListener,redisSetUpdateAndAddListener.getTopic());
        container.addMessageListener(redisSortUpdateAndAddListener,redisSortUpdateAndAddListener.getTopic());
        //監(jiān)聽所有key的過期事件
//        container.addMessageListener(redisExpiredListener,redisExpiredListener.getTopic());
        return container;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        // 創(chuàng)建模板
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 設(shè)置連接工廠
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 設(shè)置序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // key和 hashKey采用 string序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());

        // value和 hashValue采用 JSON序列化
        redisTemplate.setValueSerializer(RedisSerializer.string());
        redisTemplate.setHashValueSerializer(RedisSerializer.string());
        return redisTemplate;
    }
}

4.監(jiān)聽類

監(jiān)聽所有類型的刪除操作:

package com.redisDemo.listener;

import lombok.Data;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.stereotype.Component;

@Component
@Data
public class RedisDeleteListener implements MessageListener {
 
    //監(jiān)聽主題
    private  final PatternTopic topic = new PatternTopic("__keyevent@*__:del");
 
    /**
     *
     * @param message 消息
     * @param pattern 主題
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String topic = new String(pattern);
        String msg = new String(message.getBody());
        System.out.println("收到key的刪除,消息主題是:"+ topic+",消息內(nèi)容是:"+msg);
    }
}

監(jiān)聽hash類型新增/修改: 

package com.redisDemo.listener;

import lombok.Data;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.stereotype.Component;

@Component
@Data
public class RedisHashUpdateAndAddListener implements MessageListener {
	//監(jiān)聽的主題
    private  final PatternTopic topic = new PatternTopic("__keyevent@*__:hset");
 
    @Override
    public void onMessage(Message message, byte[] pattern){
        String topic = new String(pattern);
        String msg = new String(message.getBody());
        System.out.println("收到key更新或修改,消息主題是:"+ topic+",消息內(nèi)容是:"+msg);
    }
 
}

監(jiān)聽list類型的添加/修改: 

package com.redisDemo.listener;

import lombok.Data;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.stereotype.Component;

@Component
@Data
public class RedisListUpdateAndAddListener implements MessageListener {
	//監(jiān)聽的主題
    private  final PatternTopic topic = new PatternTopic("__keyevent@*__:lpush");
 
    @Override
    public void onMessage(Message message, byte[] pattern){
        String topic = new String(pattern);
        String msg = new String(message.getBody());
        System.out.println("收到key更新或修改,消息主題是:"+ topic+",消息內(nèi)容是:"+msg);
    }
 
}

 監(jiān)聽set類型新增/修改:

package com.redisDemo.listener;

import lombok.Data;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.stereotype.Component;

@Component
@Data
public class RedisSetUpdateAndAddListener implements MessageListener {
	//監(jiān)聽的主題
    private  final PatternTopic topic = new PatternTopic("__keyevent@*__:sadd");
 
    @Override
    public void onMessage(Message message, byte[] pattern){
        String topic = new String(pattern);
        String msg = new String(message.getBody());
        System.out.println("收到key更新或修改,消息主題是:"+ topic+",消息內(nèi)容是:"+msg);
    }
 
}

監(jiān)聽zset類型新增/修改: 

package com.redisDemo.listener;

import lombok.Data;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.stereotype.Component;

@Component
@Data
public class RedisSortUpdateAndAddListener implements MessageListener {
	//監(jiān)聽的主題
    private  final PatternTopic topic = new PatternTopic("__keyevent@*__:zadd");
 
    @Override
    public void onMessage(Message message, byte[] pattern){
        String topic = new String(pattern);
        String msg = new String(message.getBody());
        System.out.println("收到key更新或修改,消息主題是:"+ topic+",消息內(nèi)容是:"+msg);
    }
 
}

監(jiān)聽string類型新增/修改: 

package com.redisDemo.listener;

import lombok.Data;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.stereotype.Component;

@Component
@Data
public class RedisUpdateAndAddListener implements MessageListener {
	//監(jiān)聽的主題
    private  final PatternTopic topic = new PatternTopic("__keyevent@*__:set");
 
    @Override
    public void onMessage(Message message, byte[] pattern){
        String topic = new String(pattern);
        String msg = new String(message.getBody());
        System.out.println("收到key更新或修改,消息主題是:"+ topic+",消息內(nèi)容是:"+msg);
    }
 
}

5.啟動(dòng)項(xiàng)目

在Redis圖形化界面添加一個(gè)數(shù)據(jù)

這下就成功監(jiān)聽到了。

如果沒有監(jiān)聽到,請確保Redis正常啟動(dòng)了。

總結(jié)

到此這篇關(guān)于如何監(jiān)聽Redis中Key值的變化的文章就介紹到這了,更多相關(guān)監(jiān)聽Redis中Key值變化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • linux部署redis集群遇到的問題及解決

    linux部署redis集群遇到的問題及解決

    Redis Cluster連接問題:使用127.0.0.1需改為公網(wǎng)IP;端口未開放(含總線端口)導(dǎo)致超時(shí)或等待;缺少-c參數(shù)引發(fā)MOVED錯(cuò)誤
    2025-08-08
  • Redis?集群模式(Cluster)原理詳解

    Redis?集群模式(Cluster)原理詳解

    redis?cluster集群是一個(gè)由多個(gè)主從節(jié)點(diǎn)集群組成的分布式服務(wù)集群,它具有復(fù)制、高可用和分片特性,cluster集群不需要sentinel?哨兵也能完成節(jié)點(diǎn)移除和故障轉(zhuǎn)移的功能,本文就詳細(xì)的給大家介紹一下Redis?集群模式原理,感興趣的朋友跟著小編一起來看看吧
    2023-07-07
  • Redis在項(xiàng)目中的使用(JedisPool方式)

    Redis在項(xiàng)目中的使用(JedisPool方式)

    項(xiàng)目操作redis是使用的RedisTemplate方式,另外還可以完全使用JedisPool和Jedis來操作redis,本文給大家介紹Redis在項(xiàng)目中的使用,JedisPool方式,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • Redis 熱 Key 問題的解決

    Redis 熱 Key 問題的解決

    熱 Key是指在 Redis 中被高頻訪問的某個(gè) Key,其訪問頻率遠(yuǎn)超其他 Key,導(dǎo)致該 Key 所在的 Redis 實(shí)例或節(jié)點(diǎn)成為系統(tǒng)瓶頸,下面就來介紹一下熱key的問題解決,感興趣的可以了解一下
    2026-02-02
  • redis如何后臺啟動(dòng)的方法

    redis如何后臺啟動(dòng)的方法

    這篇文章主要介紹了redis如何后臺啟動(dòng)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Jedis操作Redis實(shí)現(xiàn)模擬驗(yàn)證碼發(fā)送功能

    Jedis操作Redis實(shí)現(xiàn)模擬驗(yàn)證碼發(fā)送功能

    Redis是一個(gè)著名的key-value存儲系統(tǒng),也是nosql中的最常見的一種,這篇文章主要給大家介紹Jedis操作Redis實(shí)現(xiàn)模擬驗(yàn)證碼發(fā)送功能,感興趣的朋友一起看看吧
    2021-09-09
  • 使用AOP+redis+lua做方法限流的實(shí)現(xiàn)

    使用AOP+redis+lua做方法限流的實(shí)現(xiàn)

    本文主要介紹了使用AOP+redis+lua做方法限流的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Redis服務(wù)自動(dòng)開啟、設(shè)置密碼和閃退問題及解決

    Redis服務(wù)自動(dòng)開啟、設(shè)置密碼和閃退問題及解決

    本文介紹了如何在Windows上設(shè)置和配置Redis密碼、實(shí)現(xiàn)Redis服務(wù)自動(dòng)開啟以及解決Redis閃退問題的方法和步驟
    2025-12-12
  • Redis安裝與使用方法小結(jié)

    Redis安裝與使用方法小結(jié)

    這篇文章主要介紹了Redis安裝與使用方法,結(jié)合實(shí)例形式分析了Redis數(shù)據(jù)庫的下載、安裝、啟動(dòng)、設(shè)置及相關(guān)使用操作注意事項(xiàng),需要的朋友可以參考下
    2018-04-04
  • Redis分布式鎖的10個(gè)坑總結(jié)

    Redis分布式鎖的10個(gè)坑總結(jié)

    日常開發(fā)中,經(jīng)常會碰到秒殺搶購等業(yè)務(wù),為了避免并發(fā)請求造成的庫存超賣等問題,我們一般會用到Redis分布式鎖,但是使用Redis分布式鎖,很容易踩坑哦,本文將給大家分析闡述,Redis分布式鎖的10個(gè)坑,需要的朋友可以參考下
    2023-05-05

最新評論

新宁县| 天津市| 乡城县| 松溪县| 买车| 商水县| 沂水县| 油尖旺区| 镇沅| 闸北区| 晴隆县| 清河县| 沾化县| 兴义市| 绵阳市| 阜新市| 双峰县| 淄博市| 衡东县| 襄樊市| 梁河县| 航空| 龙里县| 桐乡市| 江山市| 陵水| 佛教| 林甸县| 承德市| 福海县| 佛坪县| 儋州市| 吴桥县| 诸城市| 永吉县| 高雄县| 察雅县| 阜城县| 桓台县| 乐昌市| 万山特区|