2011-11-25 53 views
2

我必须在PHP中创建一个应用程序,它将存储不同用户的手机联系人。memcache技巧 - 选择理想的密钥

用于存储电话号码表的格式如下:

id,user-id,phone-number 

每当一个用户试图查看他的所有联系人,首先从缓存中的内容应该显示,然后将剩余的来自数据库。

在实现这一点,我有以下问题:

如何将电话号码存储在缓存中?我的意思是将电话号码插入memcache的关键是什么,以便我可以轻松地从任何用户那里提取数据。请记住,每个用户可以有很多电话号码,并且有很多用户。

回答

1

密钥应该使用的用户id

user id { mobile number ... + list of contact ...[which is the user id]} 
// by accessing this key able to get all mobile number 
// and his contact list 

建议值应尽可能简单,
没有JSON,没有串行化数据

user id {m:xxx,xxxx..., c:yyy,yyy,yyy} 

这是为了节省空间,并且还节省处理对于json_decode/unserailize

当获取用户的所有联系人时

1. fetch cache using user id (one call) 
2. iterate the list of contact 
3. fetch parellel of all the contact (user) key * function handling 
4. iterate to build a multi dimensional array 

当用户添加/更新/删除手机号码,
或添加/更新/删除手机号码

1. fetch cache using user id (one call) 
2. expire the key using user id 
3. iterate the cache result 

你的功能应该是,如果内存缓存中不存在缓存,
从取数据库,
set memcache,
返回数据库结果

+0

为特定用户添加新号码时,是否需要删除该用户ID的缓存条目,然后添加新列表?同样对于删除,我应该从缓存中删除整个条目并添加该ID的新列表? –

+0

是的,对用户所做的任何更改,都需要将其缓存过期以保持数据的新鲜度。一旦找不到缓存,从数据库获取,将其设置为memcache – ajreal

0

缓存密钥格式应该是

12_contacts其中12是用户ID。

在密钥内部,您可以将该用户的联系人的完整列表作为数组存储。通常这意味着只要用户联系人发生变化,您就可以清除或重建memcache密钥。您需要将完整的联系人列表作为数组存储在密钥中,存储部分列表,然后查询其他人是否会破坏目的。

+0

但是,如果用户有太多的联系人,以适应1MB空间来存储t他重视对应一把钥匙,那该怎么办? –

+0

购买更多硬盘空间。 memcache的用途是速度,memcache需要驱动器空间。 – Julien