本发明涉及网络技术领域,具体涉及是一种基于redis对用户app登录设备数量控制的方法。
背景技术:
服务器对用户提供服务时往往需要验证客户的登录相关信息,一部分服务是具有可登录设备数量限制,当超过可登录设备数量要求后,用户无法通过更换设备进行登录,仅能通过预留的设备进行登录,在服务器对用户登录请求进行核对时,需要反复从数据库中调用数据,频繁读取写入数据库,会大幅度降低系统速度,分布式事务处理技术成本很高,访问量过高后容易产生脏数据,影响用户使用app,因此无法有效的对用户app登录设备数量进行控制。
技术实现要素:
本发明针对现有登录设备数量控制的方法中需要反复从数据库中调用数据,频繁读取写入数据库,会大幅度降低系统速度,分布式事务处理技术成本很高,访问量过高后容易产生脏数据,影响用户使用app,因此无法有效的对用户app登录设备数量进行控制的问题,提供一种基于redis对用户app登录设备数量控制的方法。
采用的技术方案是,一种基于redis对用户app登录设备数量控制的方法包括以下步骤:
第一步,用户通过设备上的app向服务器发送登录请求信息;
第二步,服务器对登录请求信息进行拦截,同时服务器调用数据库中预留用户登录信息;
第三步,满足登录设备数量要求,服务器对用户的登录请求放行,用户能够通过app访问,并将此次登录请求信息和预留用户登录信息均写入至redis中,不满足用户登录设备数量要求,服务器禁止用户通过此设备上的app访问;
第四步,用户再次通过设备上的app向服务器发送登录请求信息;
第五步,服务器对登录请求信息进行拦截,同时服务器调用redis中写入的上次登录请求信息和预留用户登录信息;
第六步,满足登录设备数量要求,服务器对用户的登录请求放行,用户能够通过app访问,并将该次登录请求信息再写入至redis中,不满足用户登录设备数量要求,服务器禁止用户通过该设备上的app访问。
进一步的,第一步,登录请求信息包括此设备的设备号。
可选的,第二步,预留用户登录信息包括预留用户可登录设备数量、已登录设备数量和已登录设备的设备号。
可选的,第三步,用户可登录设备数量大于已登录设备数量,则服务器对用户的登录请求放行,用户能够通过app访问,并将此次登录请求信息中设备的设备号和预留用户登录信息中预留用户可登录设备数量、已登录设备数量和已登录设备的设备号均写入至redis中,且写入的已登录设备数量数量加1。
进一步的,第三步,用户可登录设备数量等于已登录设备数量,则服务器禁止用户通过此设备上的app访问。
可选的,第四步,登录请求信息包括该设备的设备号。
可选的,第五步,redis中写入的上次登录请求信息和预留用户登录信息包括上次登录请求信息中设备的设备号和预留用户登录信息中预留用户可登录设备数量、已登录设备数量和已登录设备的设备号。
可选的,设备号为通过信鸽sdk产生的token。
进一步的,第六步,用户可登录设备数量大于已登录设备数量,则服务器对用户的登录请求放行,用户能够通过app访问,并将此次登录请求信息中设备的设备号写入至redis中,且写入的已登录设备数量加1。
可选的,第六步,用户可登录设备数量等于已登录设备数量,则服务器禁止用户通过此设备上的app访问。
本发明的有益效果至少包括以下之一;
1、通过将从数据库进行设备信息的存储和调用更改为从redis中进行设备信息的存储和调用,大大提高了系统的运行速度,减少了开发成本,提高了系统稳定性,能够有效的对用户app登录设备数量控制。
2、解决了现有登录设备数量控制的方法中需要反复从数据库中调用数据,频繁读取写入数据库,会大幅度降低系统速度,分布式事务处理技术成本很高,访问量过高后容易产生脏数据,影响用户使用app,因此无法有效的对用户app登录设备数量进行控制的问题。
具体实施方式
为了使本发明的目的、技术方案及优点能够更加清晰明白,以下结合附图和实施例对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明保护内容。
一种基于redis对用户app登录设备数量控制的方法包括以下步骤:
第一步,用户通过设备上的app向服务器发送登录请求信息;
第二步,服务器对登录请求信息进行拦截,同时服务器调用数据库中预留用户登录信息;
第三步,满足登录设备数量要求,服务器对用户的登录请求放行,用户能够通过app访问,并将此次登录请求信息和预留用户登录信息均写入至redis中,不满足用户登录设备数量要求,服务器禁止用户通过此设备上的app访问;
第四步,用户再次通过设备上的app向服务器发送登录请求信息;
第五步,服务器对登录请求信息进行拦截,同时服务器调用redis中写入的上次登录请求信息和预留用户登录信息;
第六步,满足登录设备数量要求,服务器对用户的登录请求放行,用户能够通过app访问,并将该次登录请求信息再写入至redis中,不满足用户登录设备数量要求,服务器禁止用户通过该设备上的app访问。
本实施例中,第一步,登录请求信息包括此设备的设备号。
本实施例中,第二步,预留用户登录信息包括预留用户可登录设备数量、已登录设备数量和已登录设备的设备号。
本实施例中,第三步,用户可登录设备数量大于已登录设备数量,则服务器对用户的登录请求放行,用户能够通过app访问,并将此次登录请求信息中设备的设备号和预留用户登录信息中预留用户可登录设备数量、已登录设备数量和已登录设备的设备号均写入至redis中,且写入的已登录设备数量数量加1。用户可登录设备数量等于已登录设备数量,则服务器禁止用户通过此设备上的app访问。
基于运算的代码可以为如下:
privatebooleanfindlogindrvice(stringappkey,stringdeviceid,map<string,string>map,booleanislogin,stringuserid){
list<string>device=redisutil.hmget(appkey,logindevice);
studentdevicelimitdtostudentdevicelimitdto=newstudentdevicelimitdto();
studentdevicelimitdto.setdeviceid(deviceid);
studentdevicelimitdto.setstudentid(userid);
studentdevicelimitdto.setlogintime(newdate());
if(device!=null&&device.size()!=0&&stringutils.isnotblank(device.get(0))&&!islogin){//是否有最近登录的设备如果没有放缓存,记录库中。
stringdevicenum=device.get(0);
if(deviceid.equals(devicenum)){//当前设备是否与最近一次登录设备相同
//try{
//studentdevicelimitservice.update(studentdevicelimitdto);
//}catch(exceptione){
//e.printstacktrace();
//}
returntrue;
}else{
returnfalse;
}
}else{//没有当前登录设备或者登录方法,修改当前登录设备号
map.put(logindevice,deviceid);
redisutil.hmset(appkey,map);
try{
studentdevicelimitservice.update(studentdevicelimitdto);
}catch(exceptione){
e.printstacktrace();
}
returntrue;
}
}
在将信息写入redis中时,代码可以为如下:
privateintfinddrvicelimit(stringappkey,stringuserid,map<string,string>map){
list<string>limit=redisutil.hmget(appkey,devicelimit);
intdevicenum=0;
if(limit!=null&&limit.size()!=0&&stringutils.isnotblank(limit.get(0))){
devicenum=integer.parseint(limit.get(0));
}else{
studentmanagerdtostudentdto=newstudentmanagerdto();
try{
studentdto=studentmanagerservice.findapplogintime(userid);
}catch(exceptione){
e.printstacktrace();
}
if(studentdto!=null){
devicenum=studentdto.getdevicenum();
map.put(devicelimit,devicenum+"");
redisutil.hmset(appkey,map);
}
}
使用中,预留用户登录信息放在数据库中,当出现新的未写入设备的设备号时将预留用户登录信息和未写入设备的设备号一同写入redis中,即提高了整体处理效率,又降低了redis中数据量。
在第四步中,登录请求信息包括该设备的设备号。
在第五步中,redis中写入的上次登录请求信息和预留用户登录信息包括上次登录请求信息中设备的设备号和预留用户登录信息中预留用户可登录设备数量、已登录设备数量和已登录设备的设备号。同时设备号为通过信鸽sdk产生的token。
本实施例,第六步,用户可登录设备数量大于已登录设备数量,则服务器对用户的登录请求放行,用户能够通过app访问,并将此次登录请求信息中设备的设备号写入至redis中,且写入的已登录设备数量加1。用户可登录设备数量等于已登录设备数量,则服务器禁止用户通过此设备上的app访问。
通过将从数据库进行设备信息的存储和调用更改为从redis中进行设备信息的存储和调用,大大提高了系统的运行速度,减少了开发成本,提高了系统稳定性,能够有效的对用户app登录设备数量控制。解决了现有登录设备数量控制的方法中需要反复从数据库中调用数据,频繁读取写入数据库,会大幅度降低系统速度,分布式事务处理技术成本很高,访问量过高后容易产生脏数据,影响用户使用app,因此无法有效的对用户app登录设备数量进行控制的问题。
为了更大程度的提高速度,将写入redis的操作进行优化(由普通的写入,即获取一次链接,写入一次,关闭链接,再次写入需要再获取链接,重复上步过程;改为使用redis的管道机制,即创建一次链接,可多次写入数据,写入完成后再关闭链接)
其优化的方式可以如下:
publicstaticvoidpipelinehmset(stringkeys,map<string,string>map){
shardedjedisredis=getshardedjedis();
shardedjedispipelinep=redis.pipelined();
if(stringutil.isnotempty(keys)){
for(stringkey:keys.split(",")){
p.hmset(rediskeyutil.getapplogin(key),map);
}
}
p.sync();
}