WxJava使用lettuce客戶端的redis實現微信access_token等介面重複利用
阿新 • • 發佈:2020-12-30
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