根据得到的动态时间,设置根据时间动态请求接口(redis监听事件)

为优化性能,通过获取token的动态失效时间并利用Redis监听机制,当token失效时自动执行更新逻辑。服务启动时存入token和失效时间,监听失效事件,触发onMessage方法执行业务操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到一个问题,要根据获取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;
    }

总结: 服务启动首先会执行getTokenLiantong方法,存入一个token进去同时存入失效时间,开始进行监听,等待失效后会自动执行onMessage方法里的业务逻辑.这样就可以实现token失效和自动更新token的有效性问题.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值