redis key期限切れイベント期限切れアラートの実装
6704 ワード
redisはデフォルトで閉じており、開くことは推奨されません.この文書は参照を提供します.キースペース通知は、このプロセスによって追加の消費が発生するため、通常は有効ではありません.
1、redis構成を開く
#
# notify-keyspace-events Ex
#
# By default all notifications are disabled because most users don't need
# this feature and the feature has some overhead. Note that if you don't
# specify at least one of K or E, no events will be delivered.
notify-keyspace-events "Ex"
文字
通知の送信
K
キースペース通知、すべての通知はkeyspace@を接頭辞とし、Keyに対して
E
キーイベント通知、すべての通知はkeyevent@を接頭辞とし、eventに対して
g
DEL、EXPIRE、RENAMEなどのタイプに関係のない汎用コマンドの通知
$
文字列コマンドの通知
l
リストコマンドの通知
s
集合命令の通知
h
ハッシュコマンドの通知
z
整列集合コマンドの通知
x
≪期限切れイベント|Expired Events|ldap≫:期限切れキーが削除されるたびに送信されます.
e
駆逐(evict)イベント:maxmemoryポリシーによってキーが削除されるたびに送信
A
パラメータg$lshzxeの別名は、Allに相当する
入力したパラメータには少なくとも1つのKまたはEが必要です.そうしないと、残りのパラメータが何であれ、通知は配布されません.上の表の斜体の部分は汎用的な操作またはイベントであり、黒体は特定のデータ型の操作を表す.例えば、「Kx」は、あるKeyの失効イベントを監視したいことを示す.
2、java実現
2.1 pom構成
Spring boot 2の構成
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-redis
org.apache.commons
commons-pool2
2.2構成
import java.lang.reflect.Method;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.pro.constant.ChannelConstant;
import com.spring.pro.listener.KeyExpiredListener;
import com.spring.pro.listener.UserMsgListener;
/**
* ( )
* @ClassName: CacheService
* @Description:
* @author ybw
* @date 2017 4 20 5:44:52
*/
@Configuration
@EnableCaching //
public class CacheConfig extends CachingConfigurerSupport {
/**
* key
* @return
*/
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
/**
*
* @param redisTemplate
* @return
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(redisConnectionFactory);
return builder.build();
}
/**
* RedisTemplate
* @param factory
* @return
*/
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
// Jackson JSON
Jackson2JsonRedisSerializer
3、傍受
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
/**
* @Title: KeyExpiredListener.java
* @Package com.spring.pro.listener
* @Description:
* @author ybwei
* @date 2018 8 13 3:54:41
* @version V1.0
*/
@Component
public class KeyExpiredListener implements MessageListener {
private final static Logger LOG = LoggerFactory.getLogger(UserMsgListener.class);
@Autowired
private RedisTemplate, ?> redisTemplate;
@Override
public void onMessage(Message message, byte[] pattern) {
System.out.println("onPMessage pattern " + pattern + " " + " " + message);
String channel = new String(message.getChannel());
String str = (String) redisTemplate.getValueSerializer().deserialize(message.getBody());
LOG.info("received message channel {}, body is {}.", channel, str);
}
}
4、テスト
set aa bb
expire aa 2 # 2
aaが失効した後、通知を得ることができます.