今天遇到一个问题,要根据获取token返回的动态失效时间去自动更新token的值到redis中,这样就可以避免用一次调一次的操作,优化了性能.
解决方案 redis监听机制
先上依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
redis配置文件里也要配置
redis配置
打开redis.conf
使用默认配置,localhost:6379 不设置密码
然后在此基础上把notify-keyspace-events Ex 这一行的注释打开
设置配置文件
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
失效后会自动执行这个类,根据自己业务逻辑在这个类里处理逻辑
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
@Autowired
private RedisUtil redisUtil;
@Autowired
private UserAccountInformationService userAccountInformationService;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
/**
* 针对redis数据失效事件,进行数据处理
* @param message
* @param pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
//定义并拼接好url
String url = "xxxxxxxxxxx";
//微信获取access_token
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
Map map = JSON.parseObject(exchange.getBody(), Map.class);
Map data = (Map) map.get("data");
//从JSON中获取到access_token
String access_token = (String) data.get("access_token");
//获取失效时间
int expires_in = (int) data.get("expires_in");
//存到redis中
redisUtil.set("access_token", access_token, expires_in);
log.info("token更新完毕");
}
自己测试的话可以手动设置秒数低一些
/**
* 获取access_token
*
* @return
* @PostConstruct 代表在项目启动时就会执行的方法
* @Scheduled 代表开启定时任务
*/
@PostConstruct
public String getTokenLiantong() {
//定义并拼接好url
String url = "xxxxxxxx";
//微信获取access_token
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
Map map = JSON.parseObject(exchange.getBody(), Map.class);
Map data = (Map) map.get("data");
//从JSON中获取到access_token
access_token = (String) data.get("access_token");
//获取失效时间
int expires_in = (int) data.get("expires_in");
//用来测试所以20秒
redisUtil.set("access_token", access_token, 20);
return access_token;
}