SpringBoot获取access_token获取优化

微信接口返回的access_token默认有效期应该是7200秒(2小时)。你可以在接收到access_token后把它存储到Redis中,并设置过期时间为微信接口给的7200秒(或者稍微少一点以提供安全余量,比如7000秒)。然后在每次需要access_token时,先从Redis中获取,如果获取不到(等于null或者空字符串)就向微信接口请求新的access_token并把新的access_token存回Redis。

以下是一个简单的例子:

以下是适用RedisTemplate<Object, Object>的改动后的例子:

java

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
// ...
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
public static final int EXPIRATION = 7000;  // access token 过期时间
public static final String ACCESS_TOKEN_KEY = "wx_access_token";  // 存储到redis时的key值

@Override
public String getWXAccessToken() {

    // 从Redis获取
    ValueOperations<Object, Object> ops = redisTemplate.opsForValue();
    String accessToken = (String) ops.get(ACCESS_TOKEN_KEY);

    // 如果为空,重新拉取
    if (StringUtils.isEmpty(accessToken)) {
        RestTemplate restTemplate = new RestTemplate();
        String apiURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiURL, String.class);
        JSONObject jsonObject = JSONObject.parseObject(responseEntity.getBody());
        accessToken="";
        if (jsonObject.get("access_token") != null) {
            accessToken= (String) jsonObject.get("access_token");
            // 存入Redis并设置过期时间
            ops.set(ACCESS_TOKEN_KEY, accessToken, EXPIRATION, TimeUnit.SECONDS);
        }
    }

    return accessToken;
}

除了存储和获取access_token,还有哪些场景可以使用`RedisTemplate<Object, Object>`?

可以使用RedisTemplate<Object, Object>来操作Redis中的各种类型的数据结构,例如String、List、Set、Hash和ZSet(sorted set)。因为它的泛型是<Object, Object>,所以在序列化和反序列化时可以处理任何数据类型,包括自定义的对象。只需要确保在序列化和反序列化时使用的是一个统一的数据类型。

以下是一些RedisTemplate可以用来处理的常见场景:

  1. 缓存:Redis常被用作缓存,可以缩短数据获取的时间。例如,将数据库查询的结果缓存到Redis中,在下一次需要这些数据时,先从Redis中获取,如果Redis中没有,再去数据库查询。

  2. Session共享:在多服务器环境下,可以将用户的Session存储到Redis中,实现Session共享。

  3. 消息队列:Redis的List结构可以用作简单的消息队列,使用rpush命令(对应RedisTemplate.opsForList().rightPush())可将消息添加到队列的末尾,使用lpop命令(对应RedisTemplate.opsForList().leftPop())可从队列的头部获取消息。

  4. 排行榜:Redis的ZSet(有序集合)非常适合做排行榜,ZSet中的每个元素都关联着一个double类型的分数,Redis会根据这个分数对元素进行排序。例如,可以将用户的ID作为元素,用户的积分作为分数,存入一个ZSet,就可以实现一个积分排行榜。

  5. 计数器:Redis的String类型的值可直接进行加减操作,可以作为各种计数器使用。例如,用于记录网站访客数,或者商品的库存数量。

以上只是Redis的部分使用场景,Redis的用途非常广泛,可以灵活根据需求选择合适的数据结构和命令。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值