一个网站的实现不可避免的需要处理大量的内存数据,这大多都出于网站性能的考虑和解决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]);
}
}
}
这样,最近登录和最新注册用户的缓存数据都会按自定义排序规则进行实时的缓存更新了,不知道这样的实时缓存处理对于大并发量的网站是否能满足要求,没有进行过性能测试!慎用!!!