zoukankan      html  css  js  c++  java
  • 使用Redis共享用户登录成功的信息

    一、问题

    比如CSDN,开源中国等等网站,用户登录后不一定什么时候就会把你T了,意思就是不一定哪天在打开网站的时候就让你重新登录。这是怎么回事呢?
    再比如:如果存到将用户信息存到Redis了,不清除的话,会一直堆积到Redis,像BATJ等大公司,那种亿万用户的产品,该怎么办呢?肯定要清除,什么时候清除呢?

    二、解决思路

    1、登录成功后放到Redis,用Redis的String类型,key是token,value是用户信息的JSON串。在设置个过期时间,然后用户每次请求一次就更新过期时间。貌似很完美。问题是:如果真的亿级用户了,那么都将在redis里存储,尚未过期,这样redis承受的住吗?性能会严重下降,而且redis可能也会导致崩溃等奇怪现象。

    2、登录成功后放到Redis,用Redis的Hash类型和ZSET类型混合使用。Hash类型存储用户信息:login:token:entity;ZSET存储token和以时间作为分数:recent:token:timestamp;这时候也可以增加用户最近浏览的商品,List存储:view+token:商品entity(作为大数据分析用)。每次用户活跃都刷新ZSET的分数。在单独起一个线程一直轮训ZSET的个数,若大于我们心中的个数(比如10万),则进行删除不活跃的用户,删除哪些呢?删除ZSET里的【0,min(个数-10万,100)】,因为ZSET是按照分数升序排序的,所以从0-N去删除(删除ZSET和Hash),貌似复杂了,但是能很好的解决问题。但是存在另一个新的问题?就是你线程在进行清除工作的同时,用户操作了,这时候岂不是需要让他重新登录一次?这个问题后面在解决。



    作者:编程界的小学生
    链接:https://www.jianshu.com/p/168b94cf353b
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    RESTful API 设计指南
    Lombok 安装配置及使用方法
    Python——urllib函数网络文件获取
    C与C++面试易出知识点
    编程一年
    Java练习1
    大整数求和
    PHP数组知识点整理
    CSS——NO.10(设置技巧)
    CSS——NO.9(颜色值和长度值)
  • 原文地址:https://www.cnblogs.com/jianmingyuan/p/11043606.html
Copyright © 2011-2022 走看看