在进入我的淘宝页面时,此页面需要获取登录用户的相关信息,在访问量少的情况下,可以采用直接访问数据库的方式,但当访问量太高时,会导致数据库压力过高,因此通常采取的方法为将用户信息进行缓存,在用户数不多的情况下,这个方案还是提供了很多的帮助的,但用户数增多了一点后,出现的问题是缓存占了太多的内存,而经分析,原因是这些缓存中很多是不访问的用户信息。
1.1请写一端存储用户信息的缓存实现代码,并实现当缓存到达一定大小后,如继续新增用户信息,则将最近不访问的用户信息从缓存中踢出;
1.2由于我的淘宝是部署在多台机器上的,如用户每次访问不同的机器,以上方案会造成每台机器都需要去数据库中加载此用户信息,请给出一个方案来避免此问题。

解决方案 »

  1.   

    第一个用个map啥的存一下,存个最后一次登录时间。按时间排个序,把最后的删了
      

  2.   

    1.1 应该是一个调度算法。
    1.2 难道是session拷贝?我觉得引入memcache应该可以解决吧,既支持删除很久没用过的session,还支持分布式。
      

  3.   


    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 获取同一服务器的缓存内容。
      

  4.   

    谢谢,第二问还是有点不明白,NetBeans是个什么东东啊?我只知道它是个类似于Eclipse的IDE。
      

  5.   

    第一问是要自己设计数据结构吗?
    如果这样的话,可以用一个自适应链表保存用户信息,当某个用户信息被访问时,如果它在链表中,则将这个信息对应的节点移到表头。如果不在链表中,则在表头插入这个信息的节点。同时用一个map索引用户信息所在的节点,key存储用户名,value存储该用户信息对应的链表节点。通过map可以将访问链表信息的时间从O(n)缩短至O(1),同时可以用自适应链表维护最近没有访问的节点这个信息。增加,删除用户信息的时间复杂度都是O(1),只是空间复杂度增大。
    这是鄙人的想法。
    第二问不知道怎么做
      

  6.   

    NetBeans确实和myeclipse差不多的IDE,不过NetBeans开发图像化界面方便一些,是sun公司自己开发的一个IDE,比较占用 内存,我觉得myeclipse对于web开发方便一些