1 redis默認key過期通知是關閉的,原因是多少會對cpu性能有影響,要使用redis的key過期通知功能,就的改配置:
config set notify-keyspace-events Ex
人後重啓redis生效。
2 添加redis的配置
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;
/**
* @author :zoboy
* @Description:
* @ Date: Created in 2020-05-18 11:00
*/
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
3 寫一個監聽類
import com.alibaba.fastjson.JSON;
import com.cictec.network.bus.base.order.service.IOrderService;
import com.cictec.network.bus.busi.sys.model.entity.Order;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author :zoboy
* @Description:
* @ Date: Created in 2020-05-18 10:58
*/
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
@Resource
private IOrderService orderService;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
/**
* redis key失效,監聽
* message.toString()可以獲取失效的key
* message.getBody 獲取key對應的內容
* @param message
* @param pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
String expiredKey = message.toString();
log.info(expiredKey + "----動作觸發,開始執行");
try {
//業務處理
} catch (Exception e) {
log.error("key 過期通知處理異常,{}", e);
}
}
}
4 測試
往redis加一條數據
然後默認5秒過期,5秒後:
至此springboot使用redis的主鍵過期通知完畢!