修改redis的token处理方式

This commit is contained in:
wanggeng 2021-11-30 15:40:28 +08:00
parent d5b16d2b0d
commit 48beb19ef2

View File

@ -11,9 +11,8 @@ import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.*;
import java.util.List; import java.util.concurrent.TimeUnit;
import java.util.Map;
/** /**
* @ClassName: RedisAppTokenManager * @ClassName: RedisAppTokenManager
@ -32,10 +31,11 @@ public class RedisAppTokenService implements IAppTokenService {
@Override @Override
public AppToken getToken(String token) { public AppToken getToken(String token) {
AppToken appToken = (AppToken) redisTemplate.opsForHash().entries(TOKEN_HASH_KEY).get(token); String tokenKey = TOKEN_HASH_KEY + token;
AppToken appToken = (AppToken) redisTemplate.opsForValue().get(tokenKey);
if (appToken != null) { if (appToken != null) {
appToken.setLastTime(System.currentTimeMillis()); appToken.setLastTime(System.currentTimeMillis());
redisTemplate.opsForHash().put(TOKEN_HASH_KEY, appToken.getToken(), appToken); redisTemplate.opsForValue().set(tokenKey, appToken, 10, TimeUnit.MINUTES);
} }
return appToken; return appToken;
} }
@ -48,23 +48,25 @@ public class RedisAppTokenService implements IAppTokenService {
appToken.setLastTime(System.currentTimeMillis()); appToken.setLastTime(System.currentTimeMillis());
appToken.setAppTokenUser(appTokenUser); appToken.setAppTokenUser(appTokenUser);
appToken.setUserId(appTokenUser.getId()); appToken.setUserId(appTokenUser.getId());
Map<String, AppToken> tokens = redisTemplate.opsForHash().entries(TOKEN_HASH_KEY);
for (Map.Entry<String, AppToken> kvs : tokens.entrySet()) { Set<String> keys = redisTemplate.keys(TOKEN_HASH_KEY + "*");
if (StringUtils.equals(appToken.getAppTokenUser().getId(), kvs.getValue().getUserId())) { List<AppToken> existAppTokens = redisTemplate.opsForValue().multiGet(keys);
redisTemplate.opsForHash().delete(TOKEN_HASH_KEY, kvs.getValue().getToken()); for (AppToken existAppToken : existAppTokens) {
if (StringUtils.equals(appToken.getAppTokenUser().getId(), existAppToken.getUserId())) {
redisTemplate.delete(TOKEN_HASH_KEY + existAppToken.getToken());
break; break;
} }
} }
redisTemplate.opsForHash().put(TOKEN_HASH_KEY, appToken.getToken(), appToken); redisTemplate.opsForValue().set(TOKEN_HASH_KEY + token, appToken, 10, TimeUnit.MINUTES);
} }
@Override @Override
public List<AppTokenUser> listCurrentUsers() { public List<AppTokenUser> listCurrentUsers() {
List<AppTokenUser> users = new ArrayList<>(); List<AppTokenUser> users = new ArrayList<>();
Map<String, AppToken> tokens = redisTemplate.opsForHash().entries(TOKEN_HASH_KEY); Set<String> keys = redisTemplate.keys(TOKEN_HASH_KEY + "*");
for (Map.Entry<String, AppToken> kvs : tokens.entrySet()) { List<AppToken> existAppTokens = redisTemplate.opsForValue().multiGet(keys);
AppToken appToken = kvs.getValue(); for (AppToken existAppToken : existAppTokens) {
users.add(appToken.getAppTokenUser()); users.add(existAppToken.getAppTokenUser());
} }
return users; return users;
} }
@ -72,18 +74,15 @@ public class RedisAppTokenService implements IAppTokenService {
@Override @Override
public void clearTimeoutToken() { public void clearTimeoutToken() {
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
List<String> clearTokenKeys = new ArrayList<>(0); Set<String> clearTokenKeys = new HashSet<>(16);
Map<String, AppToken> tokens = redisTemplate.opsForHash().entries(TOKEN_HASH_KEY); Set<String> keys = redisTemplate.keys(TOKEN_HASH_KEY + "*");
for (Map.Entry<String, AppToken> kvs : tokens.entrySet()) { List<AppToken> existAppTokens = redisTemplate.opsForValue().multiGet(keys);
AppToken appToken = kvs.getValue(); for (AppToken existAppToken : existAppTokens) {
// 超过10分钟 if (currentTime - existAppToken.getLastTime() > 600000L) {
if (currentTime - appToken.getLastTime() > 600000L) { clearTokenKeys.add(TOKEN_HASH_KEY + existAppToken.getToken());
clearTokenKeys.add(kvs.getKey());
} }
} }
for (String tokenKey : clearTokenKeys) { redisTemplate.delete(clearTokenKeys);
redisTemplate.opsForHash().delete(TOKEN_HASH_KEY, tokenKey);
}
LOG.trace("本次共清理超时Token:{}个", clearTokenKeys.size()); LOG.trace("本次共清理超时Token:{}个", clearTokenKeys.size());
} }
} }