第一种状况,也是最经常使用的状况,就是获取一个帖子对应的回复,sql语句应该是象 select id from T where topicId=2008 order by createTime desc limit 0,5 select id from T where topicId=2008 order by createTime desc limit 5,5 select id from T where topicId=2008 order by createTime desc limit 10,5 的样子,那么这种列表很显然用topicId作散列是最好的,把上面三个列表缓存(能够是N个)都散列到key是topicId=2008这一个Map 中,当id是2008的帖子有新的回复时,系统自动把key是topicId=2008的散列Map清除便可。因为这种散列不须要遍历,所以能够设置成很大,例如100000,这样10万个帖子对应的全部回复列表均可以缓存起来,当有一个帖子有新的回复时,其他99999个帖子对应的回复列表都不会动,缓存的命中率极高。
第二种状况,就是后台须要显示最新的回复,sql语句应该是象 select id from T order by createTime desc limit 0,50 的样子,这种状况不须要散列,由于后台不可能有太多人访问,经常使用列表也不会太多,因此直接放到通用列表缓存B中便可。
第三种状况,获取一个用户的回复,sql语句象 select id from T where userId=2046 order by createTime desc limit 0,15 select id from T where userId=2046 order by createTime desc limit 15,15 select id from T where userId=2046 order by createTime desc limit 30,15 的样子,那么这种列表和第一种状况相似,用userId作散列便可。
第四种状况,获取一个用户对某个帖子的回复,sql语句象 select id from T where topicId=2008 and userId=2046 order by createTime desc limit 0,15 select id from T where topicId=2008 and userId=2046 order by createTime desc limit 15,15 的样子,这种状况比较少见,通常以topicId=2008为准,也放到key是topicId=2008这个散列Map里便可。
总结:这种缓存思路能够存储大规模的列表,缓存命中率极高,所以能够承受超大规模的应用,可是须要技术人员根据自身业务逻辑来配置须要作散列的字段,通常用一个表的索引键作散列(注意顺序,最散的字段放前面),假设以userId为例,能够存储N个用户的M种列表,若是某个用户的相关数据发生变化,其他 N-1个用户的列表缓存纹丝不动。以上说明的都是如何缓存列表,缓存长度和缓存列表思路彻底同样,如缓存象select count(*) from T where topicId=2008这样的长度,也是放到topicId=2008这个散列Map中。若是再配合好使用mysql的内存表和memcached,加上F5设备作分布式负载均衡,该系统对付像1000万IP/天这种规模级的应用都足够了,除搜索引擎外通常的应用网站到不了这种规模。