搜索引擎

时间:2016-05-14 19:44:30

标签: java caching

我想知道缓存管理的最终解决方案是什么。 假设我有一台服务器和无限数量的客户端连接到它。 客户端不断向服务器发送搜索请求(让我们调用客户端的搜索请求-'x'),服务器用一些-y'回答客户端。 现在,为了加快我的搜索引擎,我想在缓存内存中保存最受欢迎的请求(x)及其答案(y)。 (请注意,对于客户端发送到服务器的每个x都很重要,它们必须得到相同的y)。 我还有一个数据库,其中包含所有先前的请求(x,y,z次数x请求)。

我在更新缓存时遇到了一些问题:

  1. 如何判断我最不受欢迎的请求在哪个索引中保留在缓存中,以便在我的数据库中找到更受欢迎的查询时替换它(当然不扫描整个缓存)。

  2. 我该如何更新缓存? (只扫描整个数据库?这是非常昂贵的操作)

  3. 3.我的缓存包含多少请求元素?

    4.你认为HashMap是一种维护缓存的高效数据结构吗?(我正在使用java)。

    5.i正在考虑根据最后的T(某些数字)查询更新我的缓存,而不是在浏览数据库上的所有请求时更新它。 因为可能有一些曾经很受欢迎的请求而且它们不再受欢迎了,如果有一个新的流行请求,它可能需要很长时间才能根据节目数量进入缓存(它也必须更快,因为我不必扫描整个数据库)。这是管理缓存的合法方式吗?

2 个答案:

答案 0 :(得分:1)

一个单身汉要求电脑找到他是完美的伴侣。

“我想要一个小而有魅力的同伴,热爱水上运动,喜欢团体活动。”

电脑回答:“玛丽是企鹅”

(引自:http://www.recipeapart.com/perfect-partner/#ixzz48iEVSp1y

如果您拥有无限数量的客户端,终极缓存解决方案将使客户转发您的数据。你可以通过互联网做到这一点。正在执行此操作的示例应用程序可用,例如比特洪流。

当您缩小需求时,请查看各种开源Java缓存实现:

  • Apache Ignite
  • Apache Java Caching System
  • Apache Geode
  • inifinispan
  • hazelcast
  • 的EHCache
  • Google Guava
  • 咖啡因
  • cache2k

开始使用一个。阅读手册。

阅读我的博客:cruftex.net

不同的场景需要不同的解决方案。

据我所知,这些项目都没有成功构建终极缓存。据我所知,通过使用所有当前的实现,没有用户知道具有终极缓存。

可能是我应该将我的缓存实现命名为"终极缓存"。但那时,它就不会存在。

答案 1 :(得分:0)

以下是一些想法:

  1. 典型的缓存存储由请求的哈希码索引的缓存值。因此,如果您知道该请求,则应该能够根据该请求使缓存无效。或者您可以使用合理的到期时间,缓存API会自动删除过期的元素。

  2. 更新缓存。如果您的数据存储在数据库中,最好的方法是使用存储在数据库中的更新计数器或时间戳。当请求进入并且缓存的请求的时间戳与数据库不同时,它需要从数据库中完整地读取它。 Cacheonix使用其DataSource API缓存SQL查询。

  3. 至于缓存的大小,它应该足够大,以保持健康的命中/错过率,大约80%。同时,您希望限制缓存的字节大小以避免内存不足。

  4. HashMaps不适合缓存,因为它们不会根据大小和许多其他问题提供有意义的并发和驱逐级别。有一些生产级缓存API,您可以将Cacheonix添加到列表中。

  5. 缓存API应该提供大量方法来保持缓存最新,从LRU逐出到字节大小逐出到自定义DataSource,但最终还是取决于您的业务逻辑。