在 django 文档中是这样说的:
...
One excellent feature of Memcached is its ability to share cache over multiple servers. This means you can run Memcached daemons on multiple machines, and the program will treat the group of machines as a single cache, without the need to duplicate cache values on each machine. To take advantage of this feature, include all server addresses in LOCATION, either separated by semicolons or as a list.
...
Django's cache framework - Memcached
这究竟是如何工作的?我在这个站点上阅读了一些答案,这些答案表明这是通过基于键的散列在服务器之间进行分片来完成的。
Multiple memcached servers question
How does the MemCacheStore really work with multiple servers?
这很好,但我需要一个比这更具体和详细的答案。将 django 与 pylibmc 或 python-memcached 一起使用,这个分片实际上是如何执行的?配置设置中 IP 地址的顺序是否重要?如果运行同一个 django 应用程序的两个不同的 Web 服务器有两个不同的设置文件,其中 memcached 服务器的 IP 地址以不同的顺序排列怎么办?这是否会导致每台机器使用不同的分片策略,从而导致重复键和其他低效率?
如果某台机器在列表中出现两次怎么办?例如,如果我要做这样的事情,其中 127.0.0.1 实际上与 172.19.26.240 是同一台机器?
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'127.0.0.1:11211',
'172.19.26.240:11211',
'172.19.26.242:11211',
]
}
}
如果其中一个 memcached 服务器的容量比其他服务器大怎么办?如果机器 1 的内存缓存为 64MB,机器 2 的内存缓存为 128MB,分片算法是否会考虑这一点并给予机器 2 更大比例的 key ?
我还了解到,如果 memcached 服务器丢失,那么这些 key 也会丢失。当涉及分片时,这一点很明显。更重要的是,如果 memcached 服务器出现故障并且我将其 IP 地址留在设置文件中会发生什么? django/memcached 是否会简单地无法获取任何将被分片到该故障服务器的 key ,或者它会意识到该服务器已发生故障并提出新的分片策略?如果有一个新的分片策略,它是否会智能地获取原本用于故障服务器的 key 并将它们分配给剩余的服务器,或者它是否会提出一个全新的策略,就好像第一台服务器不存在一样?导致 key 重复?
我尝试阅读 python-memcached 的源代码,但完全无法理解。我打算尝试阅读 libmemcached 和 pylibmc 的代码,但我想如果有人已经知道,在这里问会更容易。
最佳答案
执行分片的是实际的 memcached 客户端。 Django 仅将配置从 settings.CACHES 传递给客户端。
服务器的顺序无关紧要*,但是(至少对于 python-memcached)您可以为每个服务器指定一个“权重”:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
('cache1.example.org:11211', 1),
('cache2.example.org:11211', 10),
],
}
我认为快速浏览一下 memcache.py(来自 python-memcached),尤其是 memcached.Client._get_server 应该可以回答您的其余问题:
def _get_server(self, key):
if isinstance(key, tuple):
serverhash, key = key
else:
serverhash = serverHashFunction(key)
for i in range(Client._SERVER_RETRIES):
server = self.buckets[serverhash % len(self.buckets)]
if server.connect():
#print "(using server %s)" % server,
return server, key
serverhash = serverHashFunction(str(serverhash) + str(i))
return None, None
我希望其他 memcached 客户端以类似的方式实现。
@Apreche 的澄清:在一种情况下,服务器的顺序确实很重要。如果您有多个 Web 服务器,并且希望它们都将相同的 key 放在相同的 memcached 服务器上,则需要以相同的顺序使用相同的服务器列表和相同的权重配置它们
关于python - django 如何处理多个 memcached 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6876250/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m