Spring boot 结合redis实现超时处理

需求:

         实现超时处理(如订单支付超时)

解决方案:

         把某个信息作为redis的key,并设置过期时间,超时后通过redis监听器获取key值。

         (如把订单号作为key值(order:1))

实现过程:

首先,修改redis.conf配置

查看“notify-keyspace-events”的配置项,如果没有,添加“notify-keyspace-events Ex”,

Spring boot 结合redis实现超时处理_第1张图片

在springboot的maven文件中导入spring data redis的包:

 

        
            org.springframework.boot
            spring-boot-starter-data-redis
        

springboot的配置文件设置redis的连接和端口号

Spring boot 结合redis实现超时处理_第2张图片

配置redis监听器容器:

@Configuration
public class RedisListenerConfig {

	@Bean
	RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory){
		RedisMessageListenerContainer container=new RedisMessageListenerContainer();
		container.setConnectionFactory(connectionFactory);
		return  container;
	}
}

 定义监听器,继承 KeyExpirationEventMessageListener

@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener{

	public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
		super(listenerContainer);
	}

	@Override
	public void onMessage(Message message, byte[] pattern){
		String expireKey=message.toString();//获取过期信息key值
		System.out.println(expireKey);//打印key值
		String noStr=expireKey.substring(0,expireKey.indexOf(":"));
		String no=expireKey.substring(expireKey.indexOf(":")+1,expireKey.length());
		System.out.println(noStr+" "+no);
	}

}

测试:

   

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisKeyExpirationListenerTest {

	@Autowired
	private RedisTemplate redisTemplate;

	@Test
	public void testRedis() throws InterruptedException {
		String key="orderId:321";
		//设置key10秒过期
		redisTemplate.opsForValue().set(key, "1", 10, TimeUnit.SECONDS);
		Thread.sleep(20000);
	}
}

结果:

 Spring boot 结合redis实现超时处理_第3张图片

 

   在redis-cli存入信息

   Spring boot 结合redis实现超时处理_第4张图片

 打印:

你可能感兴趣的:(redis)