第一種狀況,也是最經常使用的狀況,就是獲取一個帖子對應的回覆,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/天這種規模級的應用都足夠了,除搜索引擎外通常的應用網站到不了這種規模。