如何在Web应用程序中维护每个项目类别的"当前最受欢迎"项目列表?

Raj*_*pta 5 java collections web-applications guava data-structures

我需要在我的应用程序中维护每个项目类别(大约2000个类别)的40个最近添加的,最受欢迎/最喜欢的项目的列表.我确实存储了每个项目的视图数量和数量.为此,我希望在app服务器上维护一个内存结构,以存储和检索这些项目列表.

您对如何实现这种内存数据结构有任何想法吗?重要的是,请记住相关的内存占用量并将其最小化到最小程度)?


使用:

Java 1.6

Nat*_*ord 7

在确定内存结构之前,请考虑服务器必须重新启动时会发生什么.那种内存结构将会消失.如果可以,那么你应该使用内存结构.如果不是,您可能需要考虑使用单独的域对象来处理这种元数据.

在记忆中

Apache处理器线程不共享内存,因此最好的方法是安装像memcached这样的东西.每次想要获取当前项目时,都会调用特定键("topforty").Memcached保持持久性,任何线程都可以同时调用它.这是一种高度可扩展的解决方案

但是,为了使它工作,你必须做更多的工作.某些程序需要评估当前的喜欢和视图,并更新topforty密钥.这可以通过您的管理员Web应用程序完成,也可以每小时或每天作为cron作业完成.下面定义的服务也可以这样做,只需要使用memcached而不是使用它持久存在的对象.

域对象

如果持久性更关键,并且您愿意将并发交付给Web应用程序框架,那么您希望创建一个处理此问题的服务:

public interface PopularityService {
  public List<Item> getTopItems(int count);//gets n top items

  //lets the service know someone liked a thing
  public void registerLike(Item item, Person liker);

  //lets the service know someone viewed a 
  public void registerView(Item item, Person viewer);thing
}
Run Code Online (Sandbox Code Playgroud)

这将需要一些支持对象:

public class PopularStuff {
  public List<Item> popularItems
  ...
}
Run Code Online (Sandbox Code Playgroud)

您应该将该对象持久化为单个对象(或者如果您的框架使其变得容易,则作为单个对象).您的服务应该对该对象采取行动,决定其中应包含的内容以及如何移动内容.这将是一个阅读量很大的解决方案,但不像其他静态数据那样重读,因为可能人们会做很多观点.如果你正在使用像Hibernate这样的东西,那么很容易从项目列表跳转到数据库中的实际项目.

请注意,我没有讨论基础算法,因为您没有问过这个问题,而是关于如何实现数据结构.如果您可以提供有关当前框架的详细信息,我们可以讨论更多细节.