一個網站的實現不可避免的需要處理大量的內存數據,這大多都出於網站性能的考慮和解決I/O瓶頸問題,如JavaEye網站的首頁排名數據和博客頻道的排名等數據,都進行了緩存處理,而且並非是實時的,特別是首頁的排名數據幾乎是一天才會更新一次的,同樣,QQ等門戶網站也存在大量靜態化內存數據,所以一個網站緩存的處理是至關重要的,並且好的架構需要做到代碼無侵入性,也就是說內存的更新,日志的記錄等操作都應該是“切面”處理,在我後來的網站開發中,我一般都會定義一個緩存類,如下:
Java代碼
public static LinkedList<Login> regRecentUser=new LinkedList(); //最近注冊人員
public static LinkedList<Login> regLoginedUser=new LinkedList();//最近登錄人員
public static List<Topic> hotTopic=new ArrayList();//最熱發表話題
並且會自己實現對象的排序接口,如最熱門的話題,可能是按話題對象的某幾個屬性的權重分配來實現的,類似代碼如下:
Java代碼
public class TopicCompare implements Comparator{
//熱門的話題與頂的數目和評論的數目有關,權重分配比例為4:6
public int compare(Object arg0, Object arg1) {
if((arg0 instanceof Topic) && (arg1 instanceof Topic)){
double y=((Topic)arg0).getAgreeit()*0.4 + ((Topic)arg0).getCmtnum()*0.6;
double h=((Topic)arg1).getAgreeit()*0.4 + ((Topic)arg1).getCmtnum()*0.6;
if(y==h) return 0;
else if(y>h) return 1;
else return -1;
}
return 0;
}
}
緩存的切面更新一般我喜歡使用Spring AOP,簡單而實用,一般需求都能滿足,ASPect語法比較復雜,沒時間看,呵呵
Java代碼
import Java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
import com.common.cache.WebCacheUtils;
import com.cxlh.dao.hibernate.Login;
public class LoginAdvice implements AfterReturningAdvice {
public void afterReturning(Object returnValue, Method method, Object[] args,
Object target) throws Throwable {
if(method.getName().equalsIgnoreCase("checkUserLogin") && !returnValue.toString().equalsIgnoreCase("null")){
//最近登錄用戶緩存更新
System.out.println("=======update login cache");
WebCacheUtils.addRegLoginedUser((Login)returnValue);
}else if(method.getName().equalsIgnoreCase("addUser")){
//更新最新注冊用戶緩存
System.out.println("=======update add user cache");
WebCacheUtils.addRegRecentUser((Login)args[0]);
}
}
}
這樣,最近登錄和最新注冊用戶的緩存數據都會按自定義排序規則進行實時的緩存更新了,不知道這樣的實時緩存處理對於大並發量的網站是否能滿足要求,沒有進行過性能測試!慎用!!!