一个图片分享网站,所有用户上传的图片做了按用户ID分服务器存储。每张图片都有一个唯一的图片ID,对应上传它的用户ID。目前用户上传的图片总量已接近30亿张,也就意味着这个对应关系有30亿条。现在需要对这些键值对数据的存储做一个优化,要求:
查询速度快,数据能存储在内存中。因为我们使用了Amazon的EC2,所以希望占用内存总量不超过他们要求的17G ,数据一致性和持久化有保障。
根据网上的一些资料和推荐,我们打算用redis来存储,key为图片ID,value为用户ID。当我们实施的时候却发现,存储100W个key时就已经使用了70M内存,如果30亿个都存储进去需要21G,超过了规定的上限。
请问大家有什么好的优化方案吗?主要根据图片找到玩家这一种查询优化。
我觉得在使用redis时候有误区,redis不像memcached,是简单的key, value结构的数据容器。redis是支持hash_table的。根据你的应用应该是用hash_table来存储。
加入图片ID是10位,redis的指令是:
hset 图片ID的前5位 图片ID的后5位 user_id
通过ID切割的方式,一定程度上也可以减少内存的使用。
再有就是这么大的数量级,实现下冷热数据策略。
因为redis是单线程的,另外最好运行多个redis实例(这个根据你的访问频繁程度), 多个进程比能有效的分担负载。