工作日记(二)

1.记录一下最近在做的东西,公司项目遇到的问题。

多个账号密码异步请求接口获得数据,请求的时候,需要在头部带上token,引发了一个问题。

当token过期时,多个线程同时去请求获得新的token:问题如下,当第一个线程拿到token后,第二个线程去请求token。导致第一个token失效。同理,第二个token也会因为第三个token而失效。导致所有的token都不可用。

现有的解决方案是,通过设置版本号,和加各种各样的锁确保:当大量的异步请求token时,只有一个账号密码对用的线程可以拿到这把锁,进行更新,抛弃其他线程。同时,要对多账号进行同样的操作,造成加锁的过程及其复杂。经过压力测试后,仍然会有少部分的锁没有锁住,导致大面积的token失效。

 

我的做法是:拿着token的请求,只负责请求,当token失效时,当成错误的token抛弃。

token的正确性交给自定义容器来维护,并且在token的有效期内主动去更新,避免大面积的无效请求。

 

这个自定义的容器如下:

将所有的账号密码,保存在单例的Map中,同时同步到redis上。

同时,在redis中维护所有的map,格式如下:账号 | 密码,val

                                                                                 |token val

通过@Scheduled注解,让token每隔固定的时间去获得最新的tokne。

同时将所有的账号保存到list当中,遍历list,调用异步的getToken方法。

getTokne失效,再次请求tokne。

解决了需要效率,又避免了加各种复杂锁的问题。但是,在redis中放这么多数据,势必占用服务器的内存。

大佬为了效率,用空间换时间,暂时这样处理。

你可能感兴趣的:(上班日记)