1
1
package me .chanjar .weixin .mp .config .impl ;
2
2
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 ;
4
6
import me .chanjar .weixin .mp .enums .TicketType ;
5
- import redis .clients .jedis .Jedis ;
6
7
import redis .clients .jedis .JedisPool ;
7
8
8
- import java .util .concurrent .locks .Lock ;
9
- import java .util .concurrent .locks .ReentrantLock ;
9
+ import java .util .concurrent .TimeUnit ;
10
10
11
11
/**
12
12
* 基于Redis的微信配置provider.
20
20
*/
21
21
@ SuppressWarnings ("hiding" )
22
22
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:" ;
25
26
26
- /**
27
- * 使用连接池保证线程安全.
28
- */
29
- private final JedisPool jedisPool ;
27
+ private final WxMpRedisOps redisOps ;
28
+ private final String keyPrefix ;
30
29
31
30
private String accessTokenKey ;
32
31
private String lockKey ;
33
32
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 ;
36
40
}
37
41
38
42
/**
@@ -41,72 +45,57 @@ public WxMpRedisConfigImpl(JedisPool jedisPool) {
41
45
@ Override
42
46
public void setAppId (String appId ) {
43
47
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" ));
50
54
}
51
55
52
56
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 ());
54
58
}
55
59
56
60
@ Override
57
61
public String getAccessToken () {
58
- try (Jedis jedis = this .jedisPool .getResource ()) {
59
- return jedis .get (this .accessTokenKey );
60
- }
62
+ return redisOps .getValue (this .accessTokenKey );
61
63
}
62
64
63
65
@ Override
64
66
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 ;
68
69
}
69
70
70
71
@ Override
71
72
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 );
75
74
}
76
75
77
76
@ Override
78
77
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 );
82
79
}
83
80
84
81
@ Override
85
82
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 ));
89
84
}
90
85
91
86
@ Override
92
87
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 ;
96
89
}
97
90
98
91
@ Override
99
92
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 );
103
94
}
104
95
105
96
@ Override
106
97
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 );
110
99
}
111
100
112
101
}
0 commit comments