今天下午,使用新浪微博的查找好友功能查找好友時(shí),突然想起這樣的一個(gè)功能,應(yīng)該說這個(gè)問題我之前也考慮過,但是一直沒有很好的答案,這里做一個(gè)描述.
其實(shí)問題說白了也很簡單,查找好友的時(shí)候,可以根據(jù)用戶的一個(gè)或者多個(gè)屬性來定位數(shù)據(jù).比如一個(gè)用戶有用戶名,性別,地址三個(gè)屬性,如何做到可以根據(jù)其中的一個(gè)或者多個(gè)屬性來定位用戶呢?
首先來看存儲(chǔ)端的設(shè)計(jì),我個(gè)人認(rèn)為這個(gè)功能雖然可能用的次數(shù)不多,但是不應(yīng)該是直接去訪問查找數(shù)據(jù)庫的,否則量如果大了起來響應(yīng)會(huì)很慢.好了,如果不是直接查找數(shù)據(jù)庫的話,那么擋在數(shù)據(jù)庫前面應(yīng)該有cache服務(wù)器了.第二個(gè)問題來了,cache總是有限的,不能緩存所有的數(shù)據(jù),那么在這里查找就可能會(huì)丟失一些數(shù)據(jù),這個(gè)問題又怎么解決呢?嗯,我個(gè)人的猜測(cè)是,這里有一個(gè)平衡點(diǎn)的問題,即有一個(gè)準(zhǔn)則,比如說經(jīng)常登錄的活躍用戶信息才會(huì)留在cache中,不常訪問的用戶,找不到也不打緊了.
接下來,如果數(shù)據(jù)真的在cache中,即使如此,那么要實(shí)現(xiàn)這里提到的可以根據(jù)多個(gè)屬性來查找數(shù)據(jù)也不是很容易實(shí)現(xiàn)的.
現(xiàn)在大部分的cache系統(tǒng),比如memcached,還有我之前寫的ccache,本質(zhì)上都是key-value形式的cache,也就是僅能針對(duì)一個(gè)key值進(jìn)行搜索查找.
考慮如下的兩種實(shí)現(xiàn):
1) 緩存中數(shù)據(jù)key是用戶名,而value是用戶的其它信息如性別,城市,主頁等,那么這里就存在一個(gè)key值不唯一的問題.好了,如果把所有相同key值的數(shù)據(jù)組織在一起,比如用一個(gè)鏈表串起來,如果找到這個(gè)用戶名,再遍歷這個(gè)鏈表根據(jù)其余的參數(shù)來定位數(shù)據(jù).但是,如果用戶不是根據(jù)用戶名也就是key值來查找數(shù)據(jù)的,如何是好呢?難道說,要建立一個(gè)多key的數(shù)據(jù)結(jié)構(gòu)用于查找,就我現(xiàn)在對(duì)cache設(shè)計(jì)的了解,還沒有這種多key設(shè)計(jì)的cache,基本上都是單key的cache.
2) 緩存中數(shù)據(jù)key不僅包括用戶名,還包括了其它可以定位到用戶的屬性,也就是,與前面的實(shí)現(xiàn)不同的是,這個(gè)實(shí)現(xiàn)把多個(gè)屬性都放在key里面了.但是,如果這樣組織數(shù)據(jù),又如何定位數(shù)據(jù)呢?假設(shè)key里面有三個(gè)屬性,某次使用了其中的一個(gè)屬性來查找,下一次使用其中的兩個(gè)屬性來查找....這種設(shè)計(jì)實(shí)現(xiàn)起來還是很難的.
以上幾個(gè)問題,我今天考慮了一下,沒有太好的思路,這也越發(fā)激起我去研究數(shù)據(jù)庫實(shí)現(xiàn)的想法.疑問未除,做個(gè)紀(jì)念.
=========== 分割線 ==================
這個(gè)問題似乎我想的復(fù)雜了,問了一下朋友,說是應(yīng)該直接搜索數(shù)據(jù)庫,因?yàn)橐话氵@樣的搜索量不會(huì)很多.