Java带有效期的Map

最近在做zuul的限流功能!在filter中我用ConCurrentHashMap计数,然而map中的key没有失效删除的地方。

于是就搜了一下,结果搜到的结果不是很满意,很多搜到的实现都是让key失效了,但是还是保存在map中!我真正想要的是能够让key定时失效,失效的key被gc!

所以按如下规则自己写了一个map:

1、该map的实现基于ConcurrentMap,在并发情况下保证了线程安全;

2、该map没存保存key、value的时候,都要同同时保存key的有效时间;

3、该map自带一个定时任务,每次定时任务触发都会遍历该map清除失效的key-value,并释放缓存。

不多说了,代码如下:


import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Description: 带有效期的Map。
 * 每个key存入该map时,都需要设置key的有效期!当超期后,该key失效!
 * 此外,该map加入了一个定时器,每间隔一段时间,就自动扫描该map一次,清除失效的key
 * @author:  yu.jinlong
 * @Date: 2019-11-22 16:42:50
 * @param <K>
 * @param <V>
 */
public class ExpiryMap<K, V> implements Map<K, V> {
    private boolean isRefresh = false;
   
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Spring Boot中将Token保存到Redis并设置有效期的代码可以如下所示: 首先,确保已经配置好Redis的连接信息和依赖项。 1. 创建一个TokenUtil工具类,用于生成和验证Token: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Date; import java.util.HashMap; import java.util.Map; @Component public class TokenUtil { @Value("${jwt.secret}") private String secret; @Value("${jwt.expiration}") private Long expiration; public String generateToken(String username) { Map<String, Object> claims = new HashMap<>(); claims.put("sub", username); claims.put("created", new Date()); return Jwts.builder() .setClaims(claims) .setExpiration(generateExpirationDate()) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } public String getUsernameFromToken(String token) { String username; try { Claims claims = getClaimsFromToken(token); username = claims.getSubject(); } catch (Exception e) { username = null; } return username; } private Date generateExpirationDate() { return new Date(System.currentTimeMillis() + expiration * 1000); } private Claims getClaimsFromToken(String token) { return Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); } } ``` 2. 创建一个TokenService服务类,用于操作Redis存储Token: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.concurrent.TimeUnit; @Service public class TokenService { private static final String REDIS_KEY_PREFIX = "token:"; @Autowired private RedisTemplate<String, String> redisTemplate; public void saveToken(String username, String token, Long expiration) { String key = REDIS_KEY_PREFIX + username; redisTemplate.opsForValue().set(key, token, expiration, TimeUnit.SECONDS); } public String getToken(String username) { String key = REDIS_KEY_PREFIX + username; return redisTemplate.opsForValue().get(key); } public void deleteToken(String username) { String key = REDIS_KEY_PREFIX + username; redisTemplate.delete(key); } } ``` 在上述代码中,TokenUtil类用于生成和验证Token,TokenService类用于将Token保存到Redis中,并提供获取和删除Token的方法。 注意,在使用上述代码之前,需要在配置文件中设置好Redis的连接信息、JWT的密钥和Token的有效期。 这样,当用户登录成功后,可以使用TokenUtil生成Token,并通过TokenService将Token保存到Redis中,设置对应的有效期。在后续需要验证用户身份的请求中,通过TokenService从Redis中获取Token,并使用TokenUtil验证Token的有效性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值