寻找内存缓存解决方案

时间:2012-07-11 08:59:42

标签: caching grails ehcache grails-2.0

在我们的项目中,我们必须存储有关多个设备的最新信息。设备定期将这些信息传输到服务器。服务器将接收到的信息存储在多个表中,并更新同步列表中的对象,这些列表显示设备的当前状态。

为避免数据库负载过重,某些视图会通过同步列表访问缓存的对象,以显示所请求设备的状态信息。

同步列表位于服务类中,如下所示:

private Map<Long, DeviceStatus> statusMap = java.util.Collections.synchronizedMap(new HashMap<Long, DeviceStatus>()) // key = unique id

服务API提供了通过id或其他属性更新,删除,...列表条目的方法。

我们对当前的解决方案不满意,因为您无法在更多正在运行的实例中共享状态信息。此外,不可能监视此类列表的内存使用情况。

我们正在考虑两种解决方案:

解决方案1:

引入HSQLDB数据库(借助dataSource插件)来存储经常更新的信息。使用此解决方案,所有GORM功能(如findBY)都将保留。缺点:存储分布在几个系统之间。

解决方案2:

将POJO DeviceStatus实现为域类并使其可缓存。将来,兵马俑可用于在多个系统上共享缓存信息。缺点:我们无需将此信息存储在数据库中。是否存在仅在内存中存储域类的方法或选项。在启动期间,通过从多个数据源(=表)中获取信息来初始化DeviceStatus缓存。

要求:

  • 使用findBy
  • 等方法访问缓存的对象
  • 在多个系统上分配缓存(使用ehcache和terracotta)

您如何看待这些解决方案,是否有针对所述方案的更好解决方案?我们是否可以使用新引入的缓存插件来存储状态对象,并通过除唯一键之外的其他属性来访问它们?

2 个答案:

答案 0 :(得分:0)

你看过memcache http://memcached.org吗?它是一个开源的内存缓存系统,易于设置。您可以将任何可用的服务器添加到池中。您可以按键/值存储数据,这样就可以确保填充的内容是可序列化的。它将作为Web应用程序的独立层运行,因此您的任何应用程序实例都可以访问它而不需要我所了解的赤陶,这有助于您的JVM集群共享内存。

答案 1 :(得分:0)

你考虑过使用EhCache吗? EhCache可用于缓存任何对象,而不仅仅是域类(尽管您可以将它用作Hibernate的二级缓存)。当内存缓存已满时,您可以将EhCache设置为透明地将对象溢出到磁盘,以防止内存不足。

如果您需要跨节点同步所有缓存,则可以使用Terracotta作为分布式缓存,Terracotta与EhCache兼容。

否则你的问题似乎有点不清楚;你需要跨这些域对象的查询功能吗?