在进入我的淘宝页面时,此页面需要获取登录用户的相关信息,在访问量少的情况下,可以采用直接访问数据库的方式,但当访问量太高时,会导致数据库压力过高,因此通常采取的方法为将用户信息进行缓存,在用户数不多的情况下,这个方案还是提供了很多的帮助的,但用户数增多了一点后,出现的问题是缓存占了太多的内存,而经分析,原因是这些缓存中很多是不访问的用户信息。
1.1请写一端存储用户信息的缓存实现代码,并实现当缓存到达一定大小后,如继续新增用户信息,则将最近不访问的用户信息从缓存中踢出;
1.2由于我的淘宝是部署在多台机器上的,如用户每次访问不同的机器,以上方案会造成每台机器都需要去数据库中加载此用户信息,请给出一个方案来避免此问题。
1.1请写一端存储用户信息的缓存实现代码,并实现当缓存到达一定大小后,如继续新增用户信息,则将最近不访问的用户信息从缓存中踢出;
1.2由于我的淘宝是部署在多台机器上的,如用户每次访问不同的机器,以上方案会造成每台机器都需要去数据库中加载此用户信息,请给出一个方案来避免此问题。
解决方案 »
- httpclient连续访问网页获取数据,是否会遇到缓存
- servlet配置总是不成功,该如何访问servlet
- spring bean和ejb3.0 bean
- 各位如论如何得帮我,进来看一下! 配置apache服务器的问题,在线等!!!
- 各位看一下拉!急啊!
- 我自己做的JSP网站,请高手来看看,献丑了
- 怎么让表格的第一行不动,其他的行可以象下拉表列那样拉动
- 请问在tomcat中conf\server.xml怎么设置?在线等待!!
- .ear文件如何生成?
- 用jspsmartupload上传文件,在表单中还有其他几个文本框,用一Servlet处理,上传文件正常,但其他几个文本框的值始终为null,请看里面的具体描
- 菜鸟提问,高手请进!jsp页面跳转问题
- spring 中getHibernateTemplate().save(t)
1.2 难道是session拷贝?我觉得引入memcache应该可以解决吧,既支持删除很久没用过的session,还支持分布式。
public class SessionBuffer{
private Map buffer = new HashMap();
private int limit = 11;
public Object get(Object key){
SMap smap = buffer.get(key);
smap.setLastUpdate(new Date());
return smap.getData();
}
public boolean put(Object key, Object data){
if(buffer.size()<this.limit){
buffer.put(key,new SMap(data));
return true;
}
return false;
} public int getLimit(){return this.limit;}
public void setLimit(int limit){this.limit = limit;}
class SMap{
private Object data;
private Date lastUpdate;
public SMap(Object data){
this.data = data;
this.lastUpdate = new Date();
}
public Object getData(){//do something
this.lastUpdate = new Date();
return this.data;
}
public Date getLastUpdate(){//do something
return this.lastUpdate;
}
//Setter method
}
}第二个告诉他所有服务器都使用NetBeans 获取同一服务器的缓存内容。
如果这样的话,可以用一个自适应链表保存用户信息,当某个用户信息被访问时,如果它在链表中,则将这个信息对应的节点移到表头。如果不在链表中,则在表头插入这个信息的节点。同时用一个map索引用户信息所在的节点,key存储用户名,value存储该用户信息对应的链表节点。通过map可以将访问链表信息的时间从O(n)缩短至O(1),同时可以用自适应链表维护最近没有访问的节点这个信息。增加,删除用户信息的时间复杂度都是O(1),只是空间复杂度增大。
这是鄙人的想法。
第二问不知道怎么做