我正在考虑将在线用户存储在memcached中。
首先我想到了key =>的数组。值对,其中key将是上次访问的用户ID和值时间戳。
我的问题是当目前有很多用户在线时会有相当大的数组(并且会有)。
由于memcached不是为存储大数据而构建的,您如何解决?什么是最佳做法!
感谢您的投入!
答案 0 :(得分:4)
这种方法的问题是只有提前知道密钥才能查询memcache。这意味着您必须将整个在线用户列表保留在一个已知密钥下。每次用户上线或下线时,都需要阅读列表,调整并重写。在那里存在严重的竞争条件,因此您必须使用检查和设置锁定机制。
我认为你不应该这样做。考虑保留最近用户命中的数据库表:
user_id: int
last_seen: timestamp
时间戳索引和user_id。使用以下方式在线查询朋友:
SELECT user_id FROM online WHERE user_id IN (...) AND timestamp > (10 minutes ago);
定期浏览表并批量删除旧的时间戳行。
当您的网站变大时,您可以在user_id上对此表进行分片。
编辑:
实际上,如果您不需要查询当前在线的所有用户,只需要知道某些用户是否在线,就可以执行此操作。
当用户点击页面时,
memcache.set(“online。”+ user_id,true,600 / * 10分钟* /);
要查看用户是否在线,
online = memcache.get(“online。”+ user_id);
还应该有一种多键查询memcache的方法,看看。如果你添加一个内存缓存服务器,可能会发生一些奇怪的事情,但如果你使用这些信息在用户名旁边放置一个“在线”标记,这应该不是什么大问题。