利用Redis管理过期访问的有效性(redis过期访问)
在开发过程中,管理访问的有效性是非常重要的,特别是在管理带有过期时间的访问权限的情况下更加重要,本文将介绍对使用Redis利用Redis管理过期访问的有效性的方法。
我们可以使用Redis实现过期访问的存储以及验证,根据访问权限的类型,分别存储在不同的Redis Key中,比如可以使用如下代码保存过期访问权限:
// 使用key为”access_expire_”+token,设置过期时间
String key = “access_expire_” + token;
Long expireTime = System.currentTimeMillis() + time;
jedis.setex(key, expireTime);
接着,为了在检查时更快地查询,可以采用带有有效时间的BitSet方式,例如创建BitSet长度为7天,为每个访问权限在 BitSet 中索引 offset,offset为过期时间所在天数和当天的访问权限数量(用来去重),然后使用该 offset 进行索引:
//首先确定offset
Long expireTime = getExpireTime(token);
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(expireTime));
int day = calendar.get(Calendar.DAY_OF_YEAR);
// 确定BitSet最后一天
int lastday = calendar.getActualMaximum(Calendar.DAY_OF_YEAR)?
// 从bitSet中查找
BitSet bitSet = BitSet.valueOf(jedis.get(“access_expire_bit_” + day));
// 在本天内,offset为token数量和过期时间,若不存在则过期
int offset = expireTime % day * 10000 + getTokenCount(token);
Boolean isExpired = bitSet.get(offset);
为了管理过期访问的有效性,可以使用定时任务来清理释放过期的访问权限,将 Redis Key 中储存的过期访问权限删除或释放,并同步的更新 BitSet 中过期的访问权限,以下示例为定时任务所执行的清理代码:
public void cleanExpiredAccess() {
Long now = System.currentTimeMillis();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
int day = calendar.get(Calendar.DAY_OF_YEAR);
// 清理Redis Key
Set keys = jedis.keys(“access_expire_*”);
for (String key : keys) {
Long expireTime = Long.parseLong(jedis.get(key));
if (expireTime
jedis.del(key);
}
}
// 同步更新BitSet
for (int i = 0; i
BitSet bitSet = BitSet.valueOf(jedis.get(“access_expire_bit_” + i));
jedis.set(“access_expire_bit_” + i, bitSet.toByteArray());
}
}
综上所述,我们可以使用Redis来利用Redis管理过期访问的有效性,通过存储和验证访问权限,以及使用BitSet和定时任务来清理释放过期访问权限,可以有效的简化管理访问的有效性的工作,大大的提高开发的效率。
相关文章