Skip to content

Commit 2e75e46

Browse files
authored
🎨 #1503 微信公众号模块提取redis抽象层、支持key前缀设置
1 parent 6f57472 commit 2e75e46

File tree

4 files changed

+145
-43
lines changed

4 files changed

+145
-43
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package me.chanjar.weixin.mp.config.impl;
22

3-
import me.chanjar.weixin.common.util.locks.JedisDistributedLock;
3+
import com.sun.istack.internal.NotNull;
4+
import me.chanjar.weixin.mp.config.redis.JedisWxMpRedisOps;
5+
import me.chanjar.weixin.mp.config.redis.WxMpRedisOps;
46
import me.chanjar.weixin.mp.enums.TicketType;
5-
import redis.clients.jedis.Jedis;
67
import redis.clients.jedis.JedisPool;
78

8-
import java.util.concurrent.locks.Lock;
9-
import java.util.concurrent.locks.ReentrantLock;
9+
import java.util.concurrent.TimeUnit;
1010

1111
/**
1212
* 基于Redis的微信配置provider.
@@ -20,19 +20,23 @@
2020
*/
2121
@SuppressWarnings("hiding")
2222
public class WxMpRedisConfigImpl extends WxMpDefaultConfigImpl {
23-
private static final String ACCESS_TOKEN_KEY = "wx:access_token:";
24-
private static final String LOCK_KEY = "wx:lock:";
23+
private static final String ACCESS_TOKEN_KEY_TPL = "%s:access_token:%s";
24+
private static final String TICKET_KEY_TPL = "%s:ticket:key:%s:%s";
25+
private static final String LOCK_KEY_TPL = "%s:lock:%s:";
2526

26-
/**
27-
* 使用连接池保证线程安全.
28-
*/
29-
private final JedisPool jedisPool;
27+
private final WxMpRedisOps redisOps;
28+
private final String keyPrefix;
3029

3130
private String accessTokenKey;
3231
private String lockKey;
3332

34-
public WxMpRedisConfigImpl(JedisPool jedisPool) {
35-
this.jedisPool = jedisPool;
33+
public WxMpRedisConfigImpl(@NotNull JedisPool jedisPool) {
34+
this(new JedisWxMpRedisOps(jedisPool), "wx");
35+
}
36+
37+
public WxMpRedisConfigImpl(@NotNull WxMpRedisOps redisOps, @NotNull String keyPrefix) {
38+
this.redisOps = redisOps;
39+
this.keyPrefix = keyPrefix;
3640
}
3741

3842
/**
@@ -41,72 +45,57 @@ public WxMpRedisConfigImpl(JedisPool jedisPool) {
4145
@Override
4246
public void setAppId(String appId) {
4347
super.setAppId(appId);
44-
this.accessTokenKey = ACCESS_TOKEN_KEY.concat(appId);
45-
this.lockKey = ACCESS_TOKEN_KEY.concat(appId).concat(":");
46-
accessTokenLock = new JedisDistributedLock(jedisPool, lockKey.concat("accessTokenLock"));
47-
jsapiTicketLock = new JedisDistributedLock(jedisPool, lockKey.concat("jsapiTicketLock"));
48-
sdkTicketLock = new JedisDistributedLock(jedisPool, lockKey.concat("sdkTicketLock"));
49-
cardApiTicketLock = new JedisDistributedLock(jedisPool, lockKey.concat("cardApiTicketLock"));
48+
this.accessTokenKey = String.format(ACCESS_TOKEN_KEY_TPL, this.keyPrefix, appId);
49+
this.lockKey = String.format(LOCK_KEY_TPL, this.keyPrefix, appId);
50+
accessTokenLock = this.redisOps.getLock(lockKey.concat("accessTokenLock"));
51+
jsapiTicketLock = this.redisOps.getLock(lockKey.concat("jsapiTicketLock"));
52+
sdkTicketLock = this.redisOps.getLock(lockKey.concat("sdkTicketLock"));
53+
cardApiTicketLock = this.redisOps.getLock(lockKey.concat("cardApiTicketLock"));
5054
}
5155

5256
private String getTicketRedisKey(TicketType type) {
53-
return String.format("wx:ticket:key:%s:%s", this.appId, type.getCode());
57+
return String.format(TICKET_KEY_TPL, this.keyPrefix, appId, type.getCode());
5458
}
5559

5660
@Override
5761
public String getAccessToken() {
58-
try (Jedis jedis = this.jedisPool.getResource()) {
59-
return jedis.get(this.accessTokenKey);
60-
}
62+
return redisOps.getValue(this.accessTokenKey);
6163
}
6264

6365
@Override
6466
public boolean isAccessTokenExpired() {
65-
try (Jedis jedis = this.jedisPool.getResource()) {
66-
return jedis.ttl(accessTokenKey) < 2;
67-
}
67+
Long expire = redisOps.getExpire(this.accessTokenKey);
68+
return expire == null || expire < 2;
6869
}
6970

7071
@Override
7172
public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) {
72-
try (Jedis jedis = this.jedisPool.getResource()) {
73-
jedis.setex(this.accessTokenKey, expiresInSeconds - 200, accessToken);
74-
}
73+
redisOps.setValue(this.accessTokenKey, accessToken, expiresInSeconds - 200, TimeUnit.SECONDS);
7574
}
7675

7776
@Override
7877
public void expireAccessToken() {
79-
try (Jedis jedis = this.jedisPool.getResource()) {
80-
jedis.expire(this.accessTokenKey, 0);
81-
}
78+
redisOps.expire(this.accessTokenKey, 0, TimeUnit.SECONDS);
8279
}
8380

8481
@Override
8582
public String getTicket(TicketType type) {
86-
try (Jedis jedis = this.jedisPool.getResource()) {
87-
return jedis.get(this.getTicketRedisKey(type));
88-
}
83+
return redisOps.getValue(this.getTicketRedisKey(type));
8984
}
9085

9186
@Override
9287
public boolean isTicketExpired(TicketType type) {
93-
try (Jedis jedis = this.jedisPool.getResource()) {
94-
return jedis.ttl(this.getTicketRedisKey(type)) < 2;
95-
}
88+
return redisOps.getExpire(this.getTicketRedisKey(type)) < 2;
9689
}
9790

9891
@Override
9992
public synchronized void updateTicket(TicketType type, String jsapiTicket, int expiresInSeconds) {
100-
try (Jedis jedis = this.jedisPool.getResource()) {
101-
jedis.setex(this.getTicketRedisKey(type), expiresInSeconds - 200, jsapiTicket);
102-
}
93+
redisOps.setValue(this.getTicketRedisKey(type), jsapiTicket, expiresInSeconds - 200, TimeUnit.SECONDS);
10394
}
10495

10596
@Override
10697
public void expireTicket(TicketType type) {
107-
try (Jedis jedis = this.jedisPool.getResource()) {
108-
jedis.expire(this.getTicketRedisKey(type), 0);
109-
}
98+
redisOps.expire(this.getTicketRedisKey(type), 0, TimeUnit.SECONDS);
11099
}
111100

112101
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package me.chanjar.weixin.mp.config.redis;
2+
3+
import java.util.concurrent.TimeUnit;
4+
import java.util.concurrent.locks.Lock;
5+
6+
/**
7+
* 微信公众号redis操作基本类
8+
* <p>
9+
* 非内置实现redis相关操作, 请实现该类
10+
*/
11+
public class BaseWxMpRedisOps implements WxMpRedisOps {
12+
13+
@Override
14+
public String getValue(String key) {
15+
throw new UnsupportedOperationException();
16+
}
17+
18+
@Override
19+
public void setValue(String key, String value, int expire, TimeUnit timeUnit) {
20+
throw new UnsupportedOperationException();
21+
}
22+
23+
@Override
24+
public Long getExpire(String key) {
25+
throw new UnsupportedOperationException();
26+
}
27+
28+
@Override
29+
public void expire(String key, int expire, TimeUnit timeUnit) {
30+
throw new UnsupportedOperationException();
31+
}
32+
33+
@Override
34+
public Lock getLock(String key) {
35+
throw new UnsupportedOperationException();
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package me.chanjar.weixin.mp.config.redis;
2+
3+
import lombok.AllArgsConstructor;
4+
import me.chanjar.weixin.common.util.locks.JedisDistributedLock;
5+
import redis.clients.jedis.Jedis;
6+
import redis.clients.jedis.JedisPool;
7+
8+
import java.util.concurrent.TimeUnit;
9+
import java.util.concurrent.locks.Lock;
10+
11+
/**
12+
* Jedis实现相关操作
13+
*/
14+
@AllArgsConstructor
15+
public class JedisWxMpRedisOps implements WxMpRedisOps {
16+
17+
private JedisPool jedisPool;
18+
19+
@Override
20+
public String getValue(String key) {
21+
try (Jedis jedis = this.jedisPool.getResource()) {
22+
return jedis.get(key);
23+
}
24+
}
25+
26+
@Override
27+
public void setValue(String key, String value, int expire, TimeUnit timeUnit) {
28+
try (Jedis jedis = this.jedisPool.getResource()) {
29+
jedis.psetex(key, timeUnit.toMillis(expire), value);
30+
}
31+
}
32+
33+
@Override
34+
public Long getExpire(String key) {
35+
try (Jedis jedis = this.jedisPool.getResource()) {
36+
return jedis.ttl(key);
37+
}
38+
}
39+
40+
@Override
41+
public void expire(String key, int expire, TimeUnit timeUnit) {
42+
try (Jedis jedis = this.jedisPool.getResource()) {
43+
jedis.pexpire(key, timeUnit.toMillis(expire));
44+
}
45+
}
46+
47+
@Override
48+
public Lock getLock(String key) {
49+
return new JedisDistributedLock(jedisPool, key);
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package me.chanjar.weixin.mp.config.redis;
2+
3+
import java.util.concurrent.TimeUnit;
4+
import java.util.concurrent.locks.Lock;
5+
6+
/**
7+
* 微信公众号Redis相关操作
8+
* <p>
9+
* 该接口不承诺稳定, 外部实现请继承{@link BaseWxMpRedisOps}
10+
*
11+
* @see BaseWxMpRedisOps 实现需要继承该类
12+
* @see JedisWxMpRedisOps jedis实现
13+
*/
14+
public interface WxMpRedisOps {
15+
16+
String getValue(String key);
17+
18+
void setValue(String key, String value, int expire, TimeUnit timeUnit);
19+
20+
Long getExpire(String key);
21+
22+
void expire(String key, int expire, TimeUnit timeUnit);
23+
24+
Lock getLock(String key);
25+
}

0 commit comments

Comments
 (0)