我收到了错误:
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字节。
由于这是生产并且很难复制此错误,我想我可以在这里询问是否有人之前有过相同的问题。
config.action_controller.session_store = :mem_cache_store
答案 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个字节,那么你可能还是做错了。