https://blog.csdn.net/Muscleheng/article/details/81776132

场景:

最近接到一个需求,为了方便用户使用,系统的同一个用户账号可以在5个浏览器是登录,第六个登录的把第一个挤掉,而且用户登录后长时间不操作是需要自动过期的,也就是说需要有session过期时间;

一、分析

从需求来看,用户被强制下线有两种可能,一个是session过期,二个是被后面登录的挤掉;第6个登录的把第1个登录的挤掉,那么我们就需要统计登录个数以及找到最早登录的信息;这么一想就联想到了Redis,可以使用Redis的String和ZSet数据结构来实现;

String存储的作用:session过期,需要重新登录;

ZSet存储的作用:后面登录的挤掉最先登录的;

ZSet具有排序的功能;用户登录后就是一个会话,就会产生一个session,不同的session不同的sessionid,所以:

登录时通过redis的zcart方法判断ZSet中username对应的登录数量,如果大于等于5就清除最早登录的一组数据,然后把当前登录的信息存储到redis中。否则,直接存储到redis当中即可。

1、ZSet数据存储结构

2、ZString数据存储结构