Java 搜索引擎中的缓存管理

Java 搜索引擎中的缓存管理,java,caching,Java,Caching,我想知道缓存管理的最终解决方案是什么。 假设我有一台服务器和无限数量的客户端连接到它。 客户端不断向服务器发送搜索请求(让我们调用客户端的搜索请求-'x'),服务器用一些-'y'回答客户端。 现在,为了加速我的搜索引擎,我想把最流行的请求(x)保存在缓存中,并把它们的答案(y)保存下来。 (请注意,对于客户端发送到服务器的每个相同的x,它们必须获得相同的y,这一点很重要)。 我还得到了一个数据库,它保存了所有以前的请求(x,y,z-x请求的次数) 我在更新缓存时遇到了一些问题: 如果我在数据库中

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

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

  • 如果我在数据库中发现一个更流行的查询(当然不扫描整个缓存),我如何知道我最不流行的请求保留在缓存中的哪个索引,以便替换它

  • 我应该如何更新缓存?(只需扫描整个数据库?这是相当昂贵的操作)

  • 3.我的缓存应该包含多少请求元素

    4.你认为HashMap是维护缓存的有效数据结构吗

    5.我在考虑根据最近的T-(一些数字)查询更新缓存,而不是在处理数据库上的所有请求时更新缓存。
    因为可能有一些请求过去非常流行,现在不再流行了,如果有新的流行请求,它可能需要很长时间才能进入缓存,这取决于播放的数量(因为我不必扫描整个数据库,所以速度也必须更快)。这是管理缓存的合法方式吗?

    一位单身汉要求计算机为他找到完美的伴侣

    “我想要一个身材矮小、魅力四射、热爱水上运动、喜欢集体活动的伴侣。”

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

    (引自:)

    如果您有无限数量的客户机,那么最终的缓存解决方案是让客户机转发您的数据。你可以通过互联网做到这一点。正在执行此操作的示例应用程序可用,例如bit torrent

    在缩小需求范围后,请查看各种开源Java缓存实现:

    • 阿帕奇点火
    • apachejava缓存系统
    • 阿帕奇测地线
    • 伊尼菲尼斯潘
    • 黑兹卡斯特
    • EHCache
    • 谷歌番石榴
    • 咖啡因
    开始使用一个。阅读手册

    阅读我的博客:

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

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


    也许我应该把我的缓存实现命名为“终极缓存”。但是那样的话,它就不存在了。

    以下是一些想法:

  • 典型的缓存存储由请求的哈希代码索引的缓存值。因此,如果您知道该请求,您应该能够基于该请求使缓存无效。或者,您可以使用合理的过期期限,缓存API将自动删除过期的元素

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

  • 至于缓存的大小,它应该足够大,以保持正常的命中/未命中率,大约80%。同时,您希望限制缓存的字节大小,以避免内存不足

  • HashMaps不太适合缓存,因为它们不提供基于大小和许多其他问题的有意义的并发和逐出级别。这里有一些生产级缓存API,您可以将Cacheonix添加到列表中

  • 缓存API应该为您提供多种方法来保持缓存最新,从LRU逐出到字节大小逐出再到自定义数据源,但最终取决于您的业务逻辑


  • 这个问题对StackOverflow来说太宽泛了。此外,问题不是要求您帮助编写您已经编写的代码;它更具概念性。