我正在考虑将在线用户存储在memcached中。存储在线用户php + memcache
首先我想到了key => value对的数组,其中key将是上次访问的用户标识和值timestamp。
我的问题是,当有许多用户当前在线(并且会有)时,它将会是相当大的数组。
由于memcached不是用来存储大量数据的,你会如何解决它?最佳做法是什么?
感谢您的输入!
我正在考虑将在线用户存储在memcached中。存储在线用户php + memcache
首先我想到了key => value对的数组,其中key将是上次访问的用户标识和值timestamp。
我的问题是,当有许多用户当前在线(并且会有)时,它将会是相当大的数组。
由于memcached不是用来存储大量数据的,你会如何解决它?最佳做法是什么?
感谢您的输入!
这种方法的问题是只有在事先知道密钥的情况下才能查询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( “在线” + user_ID的,真实的,600/* 10分钟* /);
要查看用户是否在线,
在线= memcache.get( “在线”。+ USER_ID);
还应该有一种方法来多键查询memcache,看起来。如果您添加一个memcache服务器,可能会发生一些奇怪的事情,但是如果您使用此信息将“在线”标记放在用户名旁边,这应该不是什么大问题。
谢谢,我知道竞赛状况。可能会实施某种数据库存储。 – 2010-12-18 10:53:15
你为什么需要这个?有什么用于存储用户ID和时间戳? – 2010-12-18 06:54:26