Dalli是否会在所有盒子中过期缓存?

时间:2012-12-14 01:30:59

标签: ruby-on-rails memcached dalli

根据https://github.com/mperham/dalli,我们可以配置多个Memcache服务器。但我不确定它是如何运作的。

假设我们正在使用带有两个服务器的memcache集群:memcache1(box1)和memcache2(box2)。

  • 用户A和用户B共享相同的资源。
  • 用户A登录并读取在box1中缓存的共享资源。
  • 用户B登录并阅读box2中缓存的共享资源。
  • 用户A更新共享资源并使box1上的缓存失效
  • 用户B没有看到更新的资源,仍然在box2中获得缓存。

到目前为止,我的理解是,我不确定缓存过期在集群环境中是如何工作的。 特别是,当我们想要急切地使缓存过期时,它会在所有盒子上到期吗?

鉴于我们在TWO rails服务器中具有相同的配置:

config.cache_store = :dalli_store, 'memcache1', 'memcache2'

您如何看待此用例?

感谢您的关注。

1 个答案:

答案 0 :(得分:9)

Memcached分片是分片,而不是复制。也就是说,每台服务器上都没有数据副本;数据在服务器之间分开。

密钥只存在于一台服务器上。 Dalli通过分发算法传递密钥以确定哪个服务器将拥有给定密钥,然后将消息传递到该服务器。多个服务器上不存在相同的密钥,因此您不必担心一次性使两个密钥都到期。如果您使密钥过期,它将在其所在的单个框上过期。

如果两个用户都通过相同的缓存密钥请求数据,那么使该缓存密钥失效将使两者无效;您不必担心用户1被路由到Box 1,而用户2被路由到Box 2,因为给定的密钥将始终映射到给定的服务器。