欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring boot+redis 監(jiān)聽(tīng)過(guò)期Key的操作方法

 更新時(shí)間:2020年08月14日 14:55:46   作者:毅大師  
這篇文章主要介紹了spring boot+redis 監(jiān)聽(tīng)過(guò)期Key,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言:

在訂單業(yè)務(wù)中,有時(shí)候需要對(duì)訂單設(shè)置有效期,有效期到了后如果還未支付,就需要修改訂單狀態(tài)。對(duì)于這種業(yè)務(wù)的實(shí)現(xiàn),有多種不同的辦法,比如:

1、使用querytz,每次生成一個(gè)訂單,就創(chuàng)建一個(gè)定時(shí)任務(wù),到期后執(zhí)行業(yè)務(wù)代碼;

2、rabbitMq中的延遲隊(duì)列;

3、對(duì)Redis的Key進(jìn)行監(jiān)控;

 1、引入依賴

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

2、修改boot的redis配置

spring:
 #redis
 redis:
 database: 0
 host: 127.0.0.1
 password: redis_123456
 port: 6379

3、在服務(wù)器中 修改redis.conf配置文件(原來(lái)notify-keyspace-events 屬性是" " 空的,我們只需要填上“Ex”就行了)

notify-keyspace-events "Ex"

4、創(chuàng)建一個(gè)Redis監(jiān)控類,用于監(jiān)控過(guò)期的key,該類需繼承KeyExpirationEventMessageListener

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
 
import java.nio.charset.StandardCharsets;
 
/**
 * @program: SpringCloud
 * @description: redis Key過(guò)期監(jiān)聽(tīng)
 * @author: zhang yi
 * @create: 2020-03-24 14:14
 */
public class KeyExpiredListener extends KeyExpirationEventMessageListener {
 
 public KeyExpiredListener(RedisMessageListenerContainer listenerContainer) {
  super(listenerContainer);
 }
 
 @Override
 public void onMessage(Message message, byte[] pattern) {
  System.out.println("過(guò)期key:" + message.toString());
 }
}

5、創(chuàng)建Redis配置類

import com.zy.rabbitmq.base.Listener.KeyExpiredListener;
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.listener.RedisMessageListenerContainer;
 
/**
 * @program: SpringCloud
 * @description: redis配置類
 * @author: zhang yi
 * @create: 2020-03-24 14:17
 */
@Configuration
public class RedisConfiguration {
 
 @Autowired
 private RedisConnectionFactory redisConnectionFactory;
 
 @Bean
 public RedisMessageListenerContainer redisMessageListenerContainer() {
  RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
  redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
  return redisMessageListenerContainer;
 }
 
 @Bean
 public KeyExpiredListener keyExpiredListener() {
  return new KeyExpiredListener(this.redisMessageListenerContainer());
 }
 
}

6、這里提供一個(gè)redis工具類,用于存儲(chǔ)值,獲取值,獲取過(guò)期時(shí)間等操作。

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
 
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
/**
 * redis 工具類
 * @Author ZhangYi
 */
@Component
public class RedisUtil {
 
	@Resource
	private RedisTemplate<String, Object> redisTemplate;
 
	/**
	 * 指定緩存失效時(shí)間
	 * 
	 * @param key 鍵
	 * @param time 時(shí)間(秒)
	 * @return
	 */
	public boolean expire(String key, long time) {
		try {
			if (time > 0) {
				redisTemplate.expire(key, time, TimeUnit.SECONDS);
			}
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
 
	/**
	 * 根據(jù)key 獲取過(guò)期時(shí)間
	 * 
	 * @param key 鍵 不能為null
	 * @return 時(shí)間(秒) 返回0代表為永久有效
	 */
	public long getExpire(String key) {
		return redisTemplate.getExpire(key, TimeUnit.SECONDS);
	}
 
	/**
	 * 判斷key是否存在
	 * 
	 * @param key 鍵
	 * @return true 存在 false不存在
	 */
	public boolean hasKey(String key) {
		try {
			return redisTemplate.hasKey(key);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
 
	/**
	 * 刪除緩存
	 * 
	 * @param key 可以傳一個(gè)值 或多個(gè)
	 */
	@SuppressWarnings("unchecked")
	public void del(String... key) {
		if (key != null && key.length > 0) {
			if (key.length == 1) {
				redisTemplate.delete(key[0]);
			} else {
				redisTemplate.delete(CollectionUtils.arrayToList(key));
			}
		}
	}
 
	// ============================String=============================
	/**
	 * 普通緩存獲取
	 * 
	 * @param key 鍵
	 * @return 值
	 */
	public Object get(String key) {
		return key == null ? null : redisTemplate.opsForValue().get(key);
	}
 
	/**
	 * 普通緩存放入
	 * 
	 * @param key 鍵
	 * @param value 值
	 * @return true成功 false失敗
	 */
	public boolean set(String key, Object value) {
		try {
			redisTemplate.opsForValue().set(key, value);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
 
	}
 
	/**
	 * 普通緩存放入并設(shè)置時(shí)間
	 * 
	 * @param key 鍵
	 * @param value 值
	 * @param time 時(shí)間(秒) time要大于0 如果time小于等于0 將設(shè)置無(wú)限期
	 * @return true成功 false 失敗
	 */
	public boolean set(String key, Object value, long time) {
		try {
			if (time > 0) {
				redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
			} else {
				set(key, value);
			}
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
}

7、測(cè)試。(這里開(kāi)放兩個(gè)接口,一個(gè)set值,并設(shè)置過(guò)期時(shí)間為10秒,一個(gè)獲取值和過(guò)期時(shí)間,當(dāng)?shù)竭_(dá)過(guò)期時(shí)間,看是否回去到過(guò)期Key)

@GetMapping("/put")
 public String demo(){
  redisUtil.set("name","zhangyi",10);
  return "aaa";
 }
 
 @GetMapping("/get")
 public Map<String,Object> get(){
  Map<String,Object> m =new HashMap<>();
  m.put("time",redisUtil.getExpire("name"));
  m.put("val",redisUtil.get("name"));
  return m;
 }

成功獲取到了過(guò)期Key,這里亂碼是因?yàn)閎oot集成的Redis存key或者value的時(shí)候,沒(méi)有配置字符串序列化。沒(méi)有配置的話是默認(rèn)使用jdk本身的序列化的。

到此這篇關(guān)于spring boot+redis 監(jiān)聽(tīng)過(guò)期Key的文章就介紹到這了,更多相關(guān)spring boot+redis 監(jiān)聽(tīng)過(guò)期Key內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Spring的注解方式實(shí)現(xiàn)AOP實(shí)例

    使用Spring的注解方式實(shí)現(xiàn)AOP實(shí)例

    本篇文章主要介紹了使用Spring的注解方式實(shí)現(xiàn)AOP實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • springboot配置文件中敏感數(shù)據(jù)(賬號(hào)密碼)加密方式

    springboot配置文件中敏感數(shù)據(jù)(賬號(hào)密碼)加密方式

    這篇文章主要介紹了springboot配置文件中敏感數(shù)據(jù)(賬號(hào)密碼)加密方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 幾句話說(shuō)清session,cookie和token的區(qū)別及說(shuō)明

    幾句話說(shuō)清session,cookie和token的區(qū)別及說(shuō)明

    這篇文章主要介紹了幾句話說(shuō)清session,cookie和token的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • spring boot 打包jar jar沒(méi)有主目錄清單問(wèn)題的完美解決方法

    spring boot 打包jar jar沒(méi)有主目錄清單問(wèn)題的完美解決方法

    這篇文章主要介紹了spring boot 打包jar jar沒(méi)有主目錄清單問(wèn)題的解決方法,本文是小編第一次寫,希望對(duì)大家有所幫助
    2018-07-07
  • SpringBoot版本升級(jí)容易遇到的一些問(wèn)題

    SpringBoot版本升級(jí)容易遇到的一些問(wèn)題

    由于項(xiàng)目需求,需要將nacos 1.4.6版本升級(jí)到2.x版本,由此引發(fā)的springboot、springcloud、springcloud Alibaba一系列版本變更,本文給大家總結(jié)一下SpringBoot版本升級(jí)容易遇到的一些問(wèn)題,需要的朋友可以參考下
    2023-12-12
  • Java實(shí)現(xiàn)爬蟲

    Java實(shí)現(xiàn)爬蟲

    這篇文章介紹了Java實(shí)現(xiàn)爬蟲的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Java中StringBuffer和StringBuilder_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中StringBuffer和StringBuilder_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    StringBuffer、StringBuilder和String一樣,也用來(lái)代表字符串。String類是不可變類,StringBuffer則是可變類,任何對(duì)它所指代的字符串的改變都不會(huì)產(chǎn)生新的對(duì)象。本文重點(diǎn)給大家介紹String、StringBuffer、StringBuilder區(qū)別,感興趣的朋友一起看看吧
    2017-04-04
  • 如何使用cmd命令行窗口運(yùn)行java文件

    如何使用cmd命令行窗口運(yùn)行java文件

    多年以來(lái)一直使用的是IDE來(lái)寫java項(xiàng)目,導(dǎo)致很多的最基礎(chǔ)的東西都漸漸模糊了,最近遇到一個(gè)問(wèn)題就是如果命令行來(lái)運(yùn)行一個(gè)java項(xiàng)目,這里總結(jié)下,這篇文章主要給大家介紹了關(guān)于如何使用cmd命令行窗口運(yùn)行java文件的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • 在java中http請(qǐng)求帶cookie的例子

    在java中http請(qǐng)求帶cookie的例子

    今天小編就為大家分享一篇在java中http請(qǐng)求帶cookie的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • SpringMVC異常處理器編寫及配置

    SpringMVC異常處理器編寫及配置

    這篇文章主要介紹了SpringMVC異常處理器編寫及配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論