【问题标题】:How to implement Memcache in my application如何在我的应用程序中实现 Memcache
【发布时间】:2011-08-03 10:51:32
【问题描述】:

鉴于以下情况,请建议我一种在我的应用程序中实现 memcache 的方法。

目前,我有 10 个 Web 服务器,其中正在运行相同的应用程序,并且有一个负载平衡器来决定将请求发送到哪个 Web 服务器。 在每个网络服务器上,我都在维护一个本地缓存,即有一些类 XYZ 控制 MySQL 表 xyz 并且这个类有初始化方法 这将预热本地缓存。

现在,假设网络服务器是 X、Y、Z。负载均衡器向 X 发送一个请求,该请求将一些值添加到 db 并更新缓存。负载均衡器再次向 Y 发送了相同的请求。但是由于服务器 Y 没有缓存中的值,它会命中数据库。

因此,在这种情况下,我应该如何在我的应用程序中实现 memcache,以便最大限度地减少数据库命中。 我是否应该有一个单独的 memcache 服务器,而所有其他 10 个网络服务器都将从这个 memcacher 服务器获取缓存数据?

【问题讨论】:

    标签: java tomcat memcached


    【解决方案1】:

    一种解决方法(虽然并不理想)是在负载平衡器上实现粘性会话,以便来自一个用户的请求始终通过同一台服务器(在他们的会话期间)。如果服务器死机或者您需要在会话之间共享缓存数据,这将无济于事(但如果您的负载均衡器支持,这将很容易且快速完成)。

    否则,更好的解决方案是使用 memcached 之类的东西(如果您喜欢冒险,也可以使用 membase)。 Memcached 可以部署在每个服务器或您的服务器上,也可以部署在单独的服务器上(使用多台服务器来避免一台服务器死机并带走您的缓存的问题)。然后在您的每个应用程序服务器上,在您的 memcached 客户端中为所有 memcached 服务器指定连接详细信息(将它们以相同的顺序放在每个服务器上,并在 memcached 客户端选项中使用一致的散列算法来确定在哪些服务器上缓存键会消失)。 简而言之 - 您现在有了一个有效的 memcached 设置(只要您在应用程序中合理地使用它)

    那里有很多 memcached 教程可以帮助您更好地完成这一切,但希望我的帖子能给您一些大方向。

    【讨论】:

    • 好的。我有点困惑。这给了我一个更清晰的画面。但是假设我有两个要缓存的数据表。以前,两者都有一个单独的本地内存缓存(保存表数据的静态哈希图变量)。但是在我的应用程序中实现 memcache 之后,我应该如何构造键,因为两个数据表可能具有相同的键。谢谢
    • 这是您用来存储数据的密钥很重要的地方。您可以使用一个系统,您可以在缓存键前面加上表名或缩短的版本,例如 table1_row10、table2_row10、table1_row13 等
    • 我一直在寻找单独维护缓存,如果可能的话。但我不想使用不同的端口/服务器单独维护它。
    • 如果为键添加前缀还不够,那么您几乎只能对所需的每个单独缓存使用一个 memcached 服务器。这可以采用每个物理服务器(并使用多个端口/虚拟接口)或多个物理服务器上的多个 memcached 实例的形式。 (当我说物理服务器时,我指的是真实服务器或虚拟机)。出于兴趣,在这种程度的分离之后你是怎么来的?
    • 其实我是想分开,以免按键干扰。但相反,我会构建密钥,使它们不会相互干扰。然后,如果我必须为某些表获取单独的缓存,那么我将使用新端口或物理服务器再创建一个 memcached 实例。
    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2010-09-07
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多