redis实战|使用redis实现登录token的需求

使用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了

    推荐阅读