2016-05-14 65 views
1

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

我遇到过一些问题,同时更新缓存:

  1. 我怎么能告诉我在最不受欢迎的请求停留在缓存中,其指数,以取代它,如果我找到一个更流行的查询在我的数据库里面(当然没有扫描整个缓存)。

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

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

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

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

+0

此问题对于StackOverflow太宽泛。另外,这个问题不是要求你已经编写的代码的帮助;它更概念化。 – CConard96

回答

1

一位学士问电脑找到他的完美搭档。

“我想要一个伴侣谁是小的和有吸引力的,喜欢水上运动和喜欢群体活动。”

计算机回答说:“玛丽企鹅”

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

如果您拥有无限数量的客户端,则缓存解决方案的最终目标是让客户端转发您的数据。你可以通过互联网做到这一点。可用的示例应用程序,例如位洪流。

当你缩小了你的要求看不同的开源Java缓存实现:

  • 阿帕奇点燃
  • 的Apache的Java缓存系统
  • 阿帕奇的Geode
  • inifinispan
  • hazelcast
  • EHCache
  • 谷歌番石榴
  • 咖啡因
  • cache2k

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

阅读我的博客在:cruftex.net

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

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

可能我应该将我的缓存实现命名为“最终缓存”。但是,它不会存在。

0

这里有一些想法:

  1. 缓存被请求的散列码索引值,典型的缓存存储。所以如果你知道这个请求,你应该可以根据这个来使缓存失效。或者您可以使用合理的过期期限,并且缓存API将自动删除过期的元素。

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

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

  4. HashMaps对于缓存并不是很好,因为它们不提供基于大小和许多其他问题的有意义的并发性和驱逐级别。有几个生产级高速缓存API,您可以将Cacheonix添加到列表中。

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