时间:2010-07-26 18:16:23

标签: ruby-on-rails caching memcached

问题

我收到了错误:

key too long "rack:session:BAh7...."
/usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/memcache-client-1.8.5/lib/memcache.rb:703:in `get_server_for_key'
/usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/memcache-client-1.8.5/lib/memcache.rb:920:in `request_setup'
/usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/memcache-client-1.8.5/lib/memcache.rb:885:in `with_server'

当我查看memcache-client-1.8.5 / lib / memcache.rb时:703

def get_server_for_key(key, options = {})
  raise ArgumentError, "illegal character in key #{key.inspect}" if key =~ /\s/
  raise ArgumentError, "key too long #{key.inspect}" if key.length > 250
  ...
end

同样根据http://code.google.com/p/memcached/wiki/FAQ#What_is_the_maxiumum_key_length?_(250_bytes),最大长度为250字节。

由于这是生产并且很难复制此错误,我想我可以在这里询问是否有人之前有过相同的问题。

问题1:我可以从memcache-client中删除该语句吗?

问题2:有没有办法减少rails中的密钥大小?我在我的production.rb

中使用了以下内容
config.action_controller.session_store = :mem_cache_store  

4 个答案:

答案 0 :(得分:4)

如果您的密钥太长,请在将每个密钥存储到Rails.cache

之前对其进行哈希处理

这样的事情:

def hash_key(string)
  Digest::SHA1.hexdigest(string)
end

答案 1 :(得分:2)

您几乎肯定会看到这一点,因为您正在从cookie存储区切换到memcached。您的浏览器仍然具有旧会话cookie,具有长ID。您需要从浏览器中删除此cookie,问题就会消失。

如果您在生产网站上从cookie存储区切换到memcached,这将是一个问题,因为您无法控制用户的浏览器。您可能需要更改会话密钥以避免在这种情况下出现问题。

答案 2 :(得分:1)

key too long "rack:session:BAh7...."

您是将整个会话作为密钥转储到缓存中吗?如果您手动添加到缓存,请发布该代码。

答案 3 :(得分:0)

这个限制似乎是由memcached本身强加的,而不是Ruby,因此删除该语句对​​你没有帮助。 memcached文档表明,如果你的密钥大小超过250个字节,那么你可能还是做错了。