9
回答
几万人在线的 session因该如何设计?

我的意思是客户端是手机。服务器需要像客户端推数据,就需要判断是在线还是离线。 是用session来做吗?是不是还要记录用户的在线离线在数据库中呢?如果是服务器维持了几万个session,效率会有影响么?需要把这些session存在memcache么?那服务器死掉了怎么办呢?


我是小菜鸟啊。。千万不要喷我。。感觉对于这种稍大规模一点的web架构就无能为力了,尤其是在session这一快。请问我该咋做呢?  

  

PHP
举报
徐建兴
发帖于4年前 9回/1K+阅
共有9个答案 最后回答: 4年前

1.用户登录时,写session并记录用户在线状态写库或日志,用户session失效时,移除库里或日志用户在线状态。

2.服务器给在线的用户推数据

session存在memcache可以,当然也有直接存数据库的;服务器挂掉怎么办?服务器都挂掉了,哪还有客户端在线离线之说,自然也就缓存中失效了

      你这个就是向客户端推送数据,我前几天刚写了个类似的东东,不过是基于浏览器的。
效果是用户打开你网站的页面后只要不关闭,你就可以实时推送消息。

原理就是:使用websocket(html5/flash)+workerman。用户打开网站后浏览器会自动发起websocket链接给你后台workerman(一个php开发的socket服务器框架),这是一个长链接,后面就是通过这个链接向用户发送数据。当站长想向用户推送消息时,就用后台页面写好消息,点击发送,在线用户就能实时收到。

demo:

后台发送消息页面:http://www.workerman.net:3333/
用户接收消息页面:http://www.workerman.net:3333/web-msg-sender.html

只是个demo哈,消息直接用alert打印出来了。原理就是我说的那样,你可以根据你的情况做一些修改。

代码地址:https://github.com/walkor/web-msg-sender

--- 共有 3 条评论 ---
错觉mark 不错啊 4年前 回复
十年巛越真吊! 4年前 回复
徐建兴人才,,,给你一百个赞,虽然我是做手机端的,但是仍然可以学到很多东西 4年前 回复

搞一个memcache的集群,按照jsessionid将请求均摊到服务器集群的某一台机器,然后每次访问的时候更新memcache的gmtModfiied时间,如果gmtModified和当前时间大于某一个值或者memecache中不存在这个key,则可以认为这个用户离线了。

--- 共有 5 条评论 ---
徐建兴回复 @明庭令 : 我还比如写入数据库,01什么的。。 4年前 回复
阳光test回复 @徐建兴 : 兄弟,你现在的需求只是要判定是否在线,如果cache中没有,你就当他不在线啊,而且服务器挂掉为什么会影响cache,分布式系统的,cache和你提供服务的server不是同一台机器的。 4年前 回复
徐建兴回复 @明庭令 : 那cache没了咋搞?我想问一个比较幼稚的问题。比如目前的大公司啊,都是把很多数据放在缓存里面。那要是服务器一下死掉了,这写数据不就没有了么? 4年前 回复
阳光test回复 @徐建兴 : 可以,但是db操作比较费时,而且你这种情况任何一次请求都对应了一次update,直接操作数据库如果在pv较大的情形下问题较大,可能db就是瓶颈了,建议cache操作 4年前 回复
徐建兴离线在线判断确实非常麻烦。我能不能直接写入数据库呢? 4年前 回复

我用cookie结合memcache做过登录验证,环境是多服务器,没有统一session服务器,把登录账号,登录时间等存入cookie,memcache的键用md5(登录账号+key ), 为了更保险,session_id也存入了memcache

--- 共有 1 条评论 ---
徐建兴有点意思。这个问题我暂时不设答案啦。。因为这个我还没有做完,就当作博客来讨论吧,,后面估计还要遇到很多问题 4年前 回复
顶部