需求
在做有時效業(yè)務需求的時候, 比如我發(fā)起一個簽到, 2小時內(nèi)有效,過期就不能再簽到了.
做法
- 讀取數(shù)據(jù)的時候判斷結(jié)束時間是都小于當前時間, 是就過期, 不是就有效
- 設置定時任務, 讓任務去做這個事情, 我們只需要讀取狀態(tài)就可以了,
- 結(jié)合緩存Redis, 既能加快速度, 還有key失效的監(jiān)聽.
這里要描述Redis鍵失效的監(jiān)聽
代碼
- 修改Redis server的配置(redis.conf)
默認是: notify-keyspace-events "",修改成 notify-keyspace-events Ex;
配置Ex對應的意思如下: E: 鍵事件通知畏线,以__keysevent@<db>__
為前綴 x:過期事件(每次key過期時生成)
# K 鍵空間通知镇匀,以__keyspace@<db>__為前綴
# E 鍵事件通知,以__keysevent@<db>__為前綴
# g del , expipre , rename 等類型無關(guān)的通用命令的通知, ...
# $ String命令
# l List命令
# s Set命令
# h Hash命令
# z 有序集合命令
# x 過期事件(每次key過期時生成)
# e 驅(qū)逐事件(當key在內(nèi)存滿了被清除時生成)
# A g$lshzxe的別名客情,因此”AKE”意味著所有的事件
- 編寫監(jiān)聽
public class MyKeyExpirationEventMessageListener extends KeyExpirationEventMessageListener{
public MyKeyExpirationEventMessageListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
// System.out.println(new String(message.getBody()));
// System.out.println(new String(message.getChannel()));
// System.out.println(new String(pattern));
// super.onMessage(message, pattern);
}
}
- SpringBoot 配置
package com.guangyiedu.clazz.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
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.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import com.guangyiedu.clazz.service.cache.MyKeyExpirationEventMessageListener;
import redis.clients.jedis.JedisPoolConfig;
/**
* redis的配置
*
* @author atrun
*
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
@SuppressWarnings("rawtypes")
public CacheManager cacheManager(RedisTemplate redisTemplate) {
return new RedisCacheManager(redisTemplate);
}
@Bean
@ConfigurationProperties(prefix = "spring.redis.pool")
public JedisPoolConfig getRedisConfig() {
JedisPoolConfig config = new JedisPoolConfig();
return config;
}
@Bean
@ConfigurationProperties(prefix = "spring.redis")
public JedisConnectionFactory getConnectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
JedisPoolConfig config = getRedisConfig();
factory.setPoolConfig(config);
return factory;
}
@Bean
public StringRedisTemplate redisTemplate() {
StringRedisTemplate template = new StringRedisTemplate(getConnectionFactory());
return template;
}
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(){
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(getConnectionFactory());
return container;
}
@Bean
public MyKeyExpirationEventMessageListener myKeyExpirationEventMessageListener (){
MyKeyExpirationEventMessageListener listener = new MyKeyExpirationEventMessageListener(redisMessageListenerContainer());
return listener;
}
}