存储在线用户php + memcache

时间:2010-12-17 23:36:34

标签: php memcached

我正在考虑将在线用户存储在memcached中。

首先我想到了key =>的数组。值对,其中key将是上次访问的用户ID和值时间戳。

我的问题是当目前有很多用户在线时会有相当大的数组(并且会有)。

由于memcached不是为存储大数据而构建的,您如何解决?什么是最佳做法!

感谢您的投入!

1 个答案:

答案 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上对此表进行分片。

编辑:

实际上,如果您不需要查询当前在线的所有用户,只需要知道某些用户是否在线,就可以执行此操作。

  1. 当用户点击页面时,

    memcache.set(“online。”+ user_id,true,600 / * 10分钟* /);

  2. 要查看用户是否在线,

    online = memcache.get(“online。”+ user_id);

  3. 还应该有一种多键查询memcache的方法,看看。如果你添加一个内存缓存服务器,可能会发生一些奇怪的事情,但如果你使用这些信息在用户名旁边放置一个“在线”标记,这应该不是什么大问题。