在項目中用了redis緩存,緩存的是數據需要設置一個過期時間
1 、首先把數據存如redis並添加失效時間:
public ResultUtil saveDelayEvent(EventInfo info){ try { Map<String,Object> map = new HashMap<>(); map.put("eventInfo",info); Date date = new Date(); long interval = (info.getDelayDate().getTime() - date.getTime())/1000; System.out.println("兩個時間相差"+interval+"秒"); stringRedisTemplate.opsForValue().set("event_" +info.getId(), map.toString(), interval, TimeUnit.SECONDS); return ResultUtil.Ok("保存成功"); }catch (Exception e){ e.printStackTrace(); return ResultUtil.Faild("保存失敗"); } }
2、設置失效時間後,要在數據失效的時候監聽到,然後再次存入或者做別的操作
/** * redis監聽 */ @Component @Slf4j public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { @Autowired private EventInfoTaskDao eventInfoTaskDao; @Autowired private MessageAPIService messageApi; private final String EXCHANGE = "openOne_event"; /** * Creates new {@link } for {@code __keyevent@*__:expired} messages. * * @param listenerContainer must not be {@literal null}. */ public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } /** * 針對redis數據失效事件,進行數據處理 * @param message * @param pattern */ @Override public void onMessage(Message message, byte[] pattern) { //獲得失效的key String expiredKey = message.toString(); if(expiredKey.contains("event_")){ String eventId = expiredKey.substring(6, expiredKey.length()); List<EventInfo> task = eventInfoTaskDao.getTask(null, eventId); JSONArray json = new JSONArray(); json.add(task); messageApi.sendMessage(EXCHANGE,eventId,json.toJSONString()); } }
另外需要注入bean:
@Configuration @EnableCaching @ConditionalOnBean(RedisCacheManager.class) public class RedisConfig extends CachingConfigurerSupport {
@Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); // 配置連接工廠 redisTemplate.setConnectionFactory(redisConnectionFactory); // 使用自定義 fastjson 序列化, 作爲 value 值序列化 FastJsonRedisSerializer FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); redisTemplate.setValueSerializer(fastJsonRedisSerializer); redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); // 使用 StringRedisSerializer 作爲 key 的序列化 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); return redisTemplate; }
@Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); return container; }
}