使用redis实现登录token的需求 需求分析:
我们用户登录成功后,
需要记录用户的基本信息,当前登录时间或者你可能会记录其他什么
比如用户浏览了什么东西。
token流程,生成一段随机字节作为令牌,服务器可以根据令牌找到令牌持有者,
随着时间的推移,旧令牌会被新令牌取代。
那么这就有个问题,服务器端需要存储令牌对应的信息,如果是关系型数据库,那么就会对关系型数据库的开销增大,虽然有批量增加,但用户的操作改变的数据库行不多,所以基本没用,这个时候呢,就需要使用redis来替代关系型数据库了。
使用redis的散列用存储令牌和用户的映射,我喜欢叫散列为hash哈哈
这里使用伪代码来操作
这里不添加过期代码,可以自行拓展
//用户登录成功后根据令牌获取用户信息
public user getUserByToken(String,token){
User user = jedis.hget("login:",token);
return user;
}
更新这些信息并不难,因为需要验证token的时候就会执行相应操作
比如添加用户的浏览记录
还是写伪代码
public boolean updateToken(String token,User user,List items){
long time = new Date().getTime();
jedis.hset("login:",token.user);
//存储映射关系
jedis.zadd("recent:",token,time);
//最近登录令牌
if(items.size>0){
jedis.zadd("viewd:"+token,items,time);
//添加用户浏览记录
jedis.zremrangebyrank("viewd:"+token,0,-26);
//保存25条记录
}
return true;
}
那么还会存在一个问题,那就是令牌过多了,占用内存过多,所以长远来看我们需要定期清理令牌,
假设我们自需要保存最近的100万个令牌,超出了每次清理100个令牌,来保证服务的可用性.
伪代码 1s清理一次
boolean quit=false;
limit=1000000;
public boolean cleanTokenBy1s(){
while(quit){
size=jedis.zcard("recent:");
//获取令牌数量
if(size<=limit){
Thread.sleep(1000);
//数量不达标休眠1s
continue;
}
endIndex=Math.min(size-limit,100);
List tokens=jedis.zrange("recent:",0.endIndex);
//获取多的那部分令牌列表左边的数据
//随后根据这些令牌删除 hdel zremdel,写伪代码真痛苦 我不写拉 emmm}
}
【redis实战|使用redis实现登录token的需求】到此了 就ok了
推荐阅读
- java|SpringBoot集成shiro+shiro-redis实现登录、授权访问和多端登录控制
- redis|redis实现登录
- Java中使用OpenCV进行图像处理|S13(增亮)
- Java中使用OpenCV进行图像处理|S14(清晰度增强)
- Java中的图像处理S14(两个图像的比较)
- Java中的图像处理S12(对比度增强)
- Java中的图像处理S11(图像的更改方向)
- Java中的图像处理S10(为图像加水印)
- Java中的图像处理S9(人脸检测)