收到新的需求在用户登陆的同时,除了要记录用户登陆的结果,还需要记录用户登陆的次数。
第一反应是使用Redis的Hash数据结构,但在测试的时候发生了点意外,初步判断是在配置RedisTemplate的时候
使用了String序列化,本来是想将String序列化改为Jackson2JsonRedisSerializer的,但因为怕影响到其他项目
所以就没改,而是换了数据类型改用zSet。
用户第一次登陆的时候使用zRank,看下这个用户今天是否登陆过,
如果用户不存在的话,则使用add增加用户进去,其中value为用户的id,score为用户今日登陆的次数。
如果用户存在的话,则使用incrementScore,将用户的登陆次数加一。
这中间存在问题,因为要将这个键设置有效期,所以在每次add操作之后,都设置有效期,但这个有效期是
针对整个key的这就导致这个key的真正有效期是最后一次add完后再加上有效期,才是这个key真正失效的时间。
这个问题暂时没有想到好的解决办法,如果下次有好的解决办法再解决。
最后在统计的时候使用到了zCard,返回这个key有多少value的数量,这样获取今日签到所有用户数量。
使用rangeWithScores将key中所有的value及其score都拿到,然后计算今日有多少用户登陆过,及其登陆次数。
zRank Olog(N)
zAdd Olog(N)
zCard O(1)
zRange withScore O(log(N)+M)
写这些东西,只是为了记录工作中在一些场景下使用到合适的方法来解决,并将这些解决办法记录下来,留着
以后再遇到的时候可以使用。
原文:https://www.cnblogs.com/chuanshanjun/p/14353750.html