一:需要监听过期的redis keys
在redis.conf 里添加 notify-keyspace-events "Ex" ,放到配置参数的最后。
二:不需要账号密码访问
改变redis.conf 里的protected-mode 的属性值为 no
三:去掉绑定的地址
在redis.conf 里注销掉 bind 127.0.0.1
./redis-service ../redis.conf &
客户端执行redis 命令。
psubscribe __keyevent@*__:expired
pubsub配置:
@Configuration @Import( value = ServiceApplication.class ) public class PubsubConfiguration { /* @Autowired private RedisClient redisClient;*/ @Bean MessageListenerAdapter messageListener() { return new MessageListenerAdapter( new RedisMessageListener() ); } @Autowired @Bean public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory ) { final RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory( connectionFactory ); container.addMessageListener( messageListener(), new ChannelTopic( "__keyevent@0__:expired" ) ); return container; } /* @Bean public MessageListener listener() { return new RedisMessageListener(); }*/ }
springboot 启动类
@SpringBootApplication @ComponentScan public class ServiceApplication implements CommandLineRunner { private static Logger logger = LoggerFactory.getLogger(ServiceApplication.class); @Override public void run(String... strings) throws Exception { } public static void main(String[] args) throws Exception { ApplicationContext ctx = SpringApplication.run(ServiceApplication.class, args); SpringContextUtil.setApplicationContext(ctx); logger.info("service start success ....."); } }
监听类实现:
public class RedisMessageListener implements MessageListener { protected Logger logger = LoggerFactory.getLogger(RedisMessageListener.class); @Autowired private BookTableBo bookTableBo; @Autowired private CalledRecordBo calledRecordBo; @Autowired private MqService mqService; @Override public void onMessage(Message message, byte[] pattern) { String key = message.toString(); try { System.out.println( "Message received: " + message.toString() ); logger.info( "Message received: " + message.toString() ); if(StringUtils.isNotBlank(key) && key.startsWith(RedisUtils.TABLE_PREFIX)){ String[] tKey = key.split("_"); if(tKey.length==7){ String traceID = UUID.randomUUID().toString(); Integer groupID = Integer.parseInt(tKey[2]); Integer shopID = Integer.parseInt(tKey[3]); long mealDate = Long.parseLong(tKey[4]); Integer mealTimeTypeID = Integer.parseInt(tKey[5]); Integer tableID = Integer.parseInt(tKey[6]); String redisKey = new StringBuilder() .append(groupID) .append("_") .append(shopID) .append("_") .append(mealDate) .append("_") .append(mealTimeTypeID) .toString(); if(null == bookTableBo){ bookTableBo =(BookTableBo) SpringContextUtil.getBean("bookTableBo"); } if(null == mqService){ mqService =(MqService) SpringContextUtil.getBean("mqService"); } DataSourceContextHolder.setDataSourceType(Constants.DB_ROUTEKEY_PREFIX_READ + groupID); List<Integer> userableUnLockTables = bookTableBo.userableUnLockTable(groupID, shopID, tableID, traceID, redisKey, mealDate, mealTimeTypeID); List<MealTimeTableStatusMqVO> mealTimeTableStatusMqBeans = new ArrayList<>(); for (Integer one:userableUnLockTables){ mealTimeTableStatusMqBeans.add(MqUtils.buildMealTimeTableStatusMqBean(one, OrderStatusEnum.FREE.getStatus(),0L,0L,0,"",0,"",0)); } mqService.sendMessToShop(shopID, MqUtils.buildUnTakeUpTableMq(traceID,mealDate,mealTimeTypeID,mealTimeTableStatusMqBeans)); mqService.sendTableStatusChangeMq(groupID,shopID,mealDate,mealTimeTypeID,userableUnLockTables,null); } } }catch (Exception e){ logger.error("handler expire key error"+key,e); } } }