一、问题

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

最新文章

  1. SQL Server 阻止了对组件“xp_cmdshell”的 过程“sys.xp_cmdshell”的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。
  2. [MVC_Json序列化]MVC之Json序列化循环引用
  3. iOS保存cookie的方法
  4. js里slice,substr和substring的区别
  5. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(2)
  6. Codeforces Round #215 (Div. 2) A. Sereja and Coat Rack
  7. Sprint第三个冲刺(第三天)
  8. Div里面载入另一个页面的实现(取代框架)(AJax)(转)
  9. linux shell中的 #!/bin/bash
  10. WPF、Silverlight项目中使用柱状图、饼状图、折线图
  11. Android For OpenCV的环境搭建
  12. awesomium_v1.6.6_sdk 百度云下载地址
  13. Pull is not possible because you have unmerged files
  14. dubbo初步认识
  15. MongoDB的客户端管理工具--nosqlbooster 连接MongoDB服务器
  16. 【Python】一些练习代码用的图片
  17. Bootstrap datepicker 在弹出窗体modal中不工作
  18. POJ - 1850 B - Code
  19. c需要注意的细节
  20. 【大数据】Spark内核解析

热门文章

  1. Java 内存结构之虚拟机栈
  2. man clock
  3. React Native 中 static的navigationOptions中的点击事件不能用this
  4. 使用穷举法结合numpy解决八皇后问题
  5. 6.10&&6.12考试反思
  6. TCP学习笔记
  7. 将MSQL中的数据导出至EXCEL
  8. C#中查找或结束程序域中的主、子进程
  9. LeetCode 46——全排列
  10. 测开之路一百零六:bootstrap布局