WxJava使用lettuce客戶端的redis實現微信access_token等接口重復利用
在使用WxJava進行微信開發時,有時候會存在調用微信接口獲取access_token到達上限的情況,這時候就需要使用到緩存來保存這些access_token以達到重復利用的目的,WxJava 也提供了相關的實現類WxMaRedisConfigImpl
,但是這個是基於jedis客戶端的實現,最新版本的springboot-redis都開始采用lettuce客戶端進行連接了,所以我們只能自己手動實現一個類似於WxMaRedisConfigImpl
的類
具體實現代碼如下
public class WxMaLettuceRedisConfigImpl extends WxMaDefaultConfigImpl {
private StringRedisTemplate stringRedisTemplate;
private static final String ACCESS_TOKEN_KEY = "wa:access_token:";
private String accessTokenKey;
public WxMaLettuceRedisConfigImpl(StringRedisTemplate stringRedisTemplate){
this.stringRedisTemplate = stringRedisTemplate;
}
/**
* 每個公眾號生成獨有的存儲key.
*/
@Override
public void setAppid(String appId) {
super.setAppid(appId);
this.accessTokenKey = ACCESS_TOKEN_KEY.concat(appId);
}
@Override
public String getAccessToken() {
return stringRedisTemplate.opsForValue().get(accessTokenKey);
}
@Override
public boolean isAccessTokenExpired() {
Long expireTime = stringRedisTemplate.getExpire(accessTokenKey);
if (ObjectUtils.isEmpty(expireTime)) {
return true;
}
// 到期時間小於2秒就算作過期了,就重新調用接口獲取
return expireTime < 2;
}
@Override
public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) {
stringRedisTemplate.opsForValue().set(accessTokenKey, accessToken, expiresInSeconds - 200, TimeUnit.SECONDS);
}
@Override
public void expireAccessToken() {
stringRedisTemplate.expire(accessTokenKey, 0, TimeUnit.SECONDS);
}
@Override
public long getExpiresTime() {
Long expire = stringRedisTemplate.getExpire(accessTokenKey);
return expire == null ? 0 : expire;
}
@Override
public void setExpiresTime(long expiresTime) {
stringRedisTemplate.expire(accessTokenKey, expiresTime, TimeUnit.SECONDS);
}
}
詳細示例已上傳gitee,地址:https://gitee.com/welitis/blog_code/tree/master/wxjava-redis-demo