2010-12-17 53 views
1

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

首先我想到了key => value对的数组,其中key将是上次访问的用户标识和值timestamp。

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

由于memcached不是用来存储大量数据的,你会如何解决它?最佳做法是什么?

感谢您的输入!

+0

你为什么需要这个?有什么用于存储用户ID和时间戳? – 2010-12-18 06:54:26

回答

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( “在线” + user_ID的,真实的,600/* 10分钟* /);

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

    在线= memcache.get( “在线”。+ USER_ID);

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

+0

谢谢,我知道竞赛状况。可能会实施某种数据库存储。 – 2010-12-18 10:53:15