From 3b37f52235a3ce09b417dceb183dc1d00b03b8a2 Mon Sep 17 00:00:00 2001 From: wuxingye <23226334@qq.com> Date: Mon, 15 Jun 2020 14:36:27 +0800 Subject: [PATCH] =?UTF-8?q?#1620=20:art:=20=E5=85=AC=E4=BC=97=E5=8F=B7?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E9=85=8D=E7=BD=AE=E7=B1=BB=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?Redisson=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: xingye.wu --- weixin-java-mp/pom.xml | 4 + .../config/impl/WxMpRedissonConfigImpl.java | 101 ++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedissonConfigImpl.java diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 6440fd25c..66f744313 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -80,6 +80,10 @@ org.projectlombok lombok + + org.redisson + redisson + diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedissonConfigImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedissonConfigImpl.java new file mode 100644 index 000000000..f1aa6b9ca --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedissonConfigImpl.java @@ -0,0 +1,101 @@ +package me.chanjar.weixin.mp.config.impl; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NonNull; +import me.chanjar.weixin.common.enums.TicketType; +import me.chanjar.weixin.common.redis.RedissonWxRedisOps; +import me.chanjar.weixin.common.redis.WxRedisOps; +import org.redisson.api.RedissonClient; + +import java.util.concurrent.TimeUnit; + +/** + * @author wuxingye + * @date 2020/6/12 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class WxMpRedissonConfigImpl extends WxMpDefaultConfigImpl { + + private static final long serialVersionUID = -5139855123878455556L; + private static final String ACCESS_TOKEN_KEY_TPL = "%s:access_token:%s"; + private static final String TICKET_KEY_TPL = "%s:ticket:key:%s:%s"; + private static final String LOCK_KEY_TPL = "%s:lock:%s:"; + private final WxRedisOps redisOps; + private final String keyPrefix; + private String accessTokenKey; + private String lockKey; + + public WxMpRedissonConfigImpl(@NonNull RedissonClient redissonClient, String keyPrefix) { + this(new RedissonWxRedisOps(redissonClient), keyPrefix); + } + + public WxMpRedissonConfigImpl(@NonNull RedissonClient redissonClient) { + this(redissonClient, null); + } + + private WxMpRedissonConfigImpl(@NonNull WxRedisOps redisOps, String keyPrefix) { + this.redisOps = redisOps; + this.keyPrefix = keyPrefix; + } + + /** + * 每个公众号生成独有的存储key. + */ + @Override + public void setAppId(String appId) { + super.setAppId(appId); + this.accessTokenKey = String.format(ACCESS_TOKEN_KEY_TPL, this.keyPrefix, appId); + this.lockKey = String.format(LOCK_KEY_TPL, this.keyPrefix, appId); + accessTokenLock = this.redisOps.getLock(lockKey.concat("accessTokenLock")); + jsapiTicketLock = this.redisOps.getLock(lockKey.concat("jsapiTicketLock")); + sdkTicketLock = this.redisOps.getLock(lockKey.concat("sdkTicketLock")); + cardApiTicketLock = this.redisOps.getLock(lockKey.concat("cardApiTicketLock")); + } + + private String getTicketRedisKey(TicketType type) { + return String.format(TICKET_KEY_TPL, this.keyPrefix, appId, type.getCode()); + } + + @Override + public String getAccessToken() { + return redisOps.getValue(this.accessTokenKey); + } + + @Override + public boolean isAccessTokenExpired() { + Long expire = redisOps.getExpire(this.accessTokenKey); + return expire == null || expire < 2; + } + + @Override + public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) { + redisOps.setValue(this.accessTokenKey, accessToken, expiresInSeconds - 200, TimeUnit.SECONDS); + } + + @Override + public void expireAccessToken() { + redisOps.expire(this.accessTokenKey, 0, TimeUnit.SECONDS); + } + + @Override + public String getTicket(TicketType type) { + return redisOps.getValue(this.getTicketRedisKey(type)); + } + + @Override + public boolean isTicketExpired(TicketType type) { + return redisOps.getExpire(this.getTicketRedisKey(type)) < 2; + } + + @Override + public synchronized void updateTicket(TicketType type, String jsapiTicket, int expiresInSeconds) { + redisOps.setValue(this.getTicketRedisKey(type), jsapiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); + } + + @Override + public void expireTicket(TicketType type) { + redisOps.expire(this.getTicketRedisKey(type), 0, TimeUnit.SECONDS); + } +}