一、问题

比如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
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

使用Redis共享用户登录成功的信息的更多相关文章

  1. spring security实现记录用户登录时间等信息

    目录 spring security实现记录用户登录时间等信息 一.原理分析 二.实现方式 2.1 自定义AuthenticationSuccessHandler实现类 2.2 在spring-sec ...

  2. 设置Cookie,登录记住用户登录信息,获取用户登录过得信息

    function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.setTime(exp.getTime() + Da ...

  3. MVC中实现只有当用户登录成功的时候才等浏览内容,否则跳转到登录页面

    第一步,在登录的时候记录Session //提供Session接口方便后面判断用户登录 Session["UserInfo"] = uinfo;  //uInfo是用户登录Mode ...

  4. SpringBoot整合redis把用户登录信息存入redis

    首先引入redis的jai包 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  5. SpringBoot使用Redis共享用户session信息

    SpringBoot引入Redis依赖: <dependency> <groupId>org.springframework.boot</groupId> < ...

  6. 使用 redis “捕捉” “用户登录过期” 事件

    实现原理及步骤: 1)登录时,计算登录过期时间,以分钟为单位作key(例如:sign_timeout_201705212233),value方面自己发挥,需要什么数据就拼什么数据进去,只是要注意,一定 ...

  7. pptpvpn记录用户登录和流量信息

    这个问题困扰了我很久,终于在pppd的man文档里,发现了踪迹.在man中的SCRIPTS下有一系列的参数,其中PEERNAME就是登陆的用户名,并且在/etc/ppp/ip-up和/etc/ppp/ ...

  8. 用户登录成功后重新获取新的Session

    HttpSession session = request.getSession();            // 用来存储原sessionde的值            ConcurrentHash ...

  9. Android 用户登录

    1:服务端代码如下 <?php /** *登录成功就返回 1,否则返回 0 */ $REQUEST_METHOD=$_SERVER['REQUEST_METHOD']; if($REQUEST_ ...

随机推荐

  1. 绑定class -vue

    1.值为对象 :class = "{ 'text-red': isActive }" data () { return { isActive : true } } :class = ...

  2. 用vue构建项目同一局域网下通过ip访问

    在webpack配置文件下改为 host:'0.0.0.0' 改为后启动跳转不到登录页面 需手动修改浏览器上的0.0.0.0:8080为自己ip加上:8080 就可以在别的电脑上进行访问了 举一反三: ...

  3. java伪代码读后感

    愚公,在这位名家身上,浓缩了项目的组织者,团队经理,编程人员,技术分析师等众多角色的优秀素质.原始需求的产生“惩山北之塞,出入之迁”项目沟通的基本方式“聚室而谋之”项目的目标“毕力平险,指通豫南,达于 ...

  4. Java——类的继承、访问控制

    [继承] <1>Java只支持单继承,不支持多继承. <2>继承父类的私有成员变量,只有所有权,没有使用权.   [继承中的构造方法]

  5. Vuex的五个核心属性

    Vuex的五个核心属性 Vuex的五个核心概念 本文参考自Vue文档,说的非常详细,建议看文档. Vuex是什么? VueX 是一个专门为 Vue.js 应用设计的状态管理架构,统一管理和维护各个vu ...

  6. 基于自定义的动态数组实现一个栈(Java语言)

    关于动态数组,参见我的上一篇关于动态数组的博文https://www.cnblogs.com/inu6/p/11717129.html 1.什么是栈? (1)只能从一端添加元素,也只能从一端取出元素, ...

  7. navigator组件(相当于a标签)

    navigator组件:页面链接: navigator组件属性: target:类型 字符串 在哪个目标上发生跳转,默认当前小程序 属性值:self 当前小程序 miniProgram 其他小程序 u ...

  8. 有关Dispose,Finalize,GC.SupressFinalize函数-托管与非托管资源释放的模式

    //这段代码来自官方示例,删除了其中用处不大的细节using System; using System.ComponentModel; /*** * 这个模式搞的这么复杂,目的是:不管使用者有没有手动 ...

  9. node.js运行配置(vs code非控制台输出)

    node.js运行配置(vs code非控制台输出) node  配置 简化  vs code 是非常强大的编译器,皆因它有有各种各样好用的插件. 在没有安装code runner插件之前,想要执行n ...

  10. codeforces 704B - Ant Man [想法题]

    题目链接:http://codeforces.com/problemset/problem/704/B ------------------------------------------------ ...