我有一个rails 4.1应用程序,其中我有一个预订部分。在本节中,我有多个子部分,如酒店,度假租赁等。
在这些部分的每一部分中,我都会从用户可以排序和过滤的相关API中获取数据。
我想缓存每个用户的响应,这样一旦我获得了数据,过滤&使用缓存数据快速排序,并且不会浪费时间再次访问其他网站。
然而,有一个问题是即使没有登录,用户也可以这样做。
我已经设置了memcached存储,它可以为第一个用户缓存数据,但是当第二个用户为第一个用户提供数据时会被覆盖。
如何为每个用户缓存数据(logggd / unlogged)? (我愿意更改缓存存储,前提是我不需要花费任何额外的工作)
答案 0 :(得分:1)
Rails实际上支持每个用户“缓存”开箱即用。它叫做会话。默认情况下,Rails使用cookie作为存储,但您可以轻松交换存储以使用Memcached或Redis来绕过浏览器对cookie施加的~4kB大小限制。
要将带有memcached的Rails用作存储后端,请使用Dalli gem:
# Gemfile
gem 'dalli'
# config/environments/production.rb
config.cache_store = :dalli_store
这可以让你存储几乎任何东西:
session[:foo] = bar
只要用户保留包含会话ID的cookie,就可以获取会话值。
如果要保持将CookieStore用于会话的性能优势,另一种方法是使用会话ID作为用于在Memcached中缓存请求的密钥的一部分,这将为每个用户提供单独的缓存。
您可以通过调用控制器中的session.id
来获取会话ID。
require 'dalli'
options = { :namespace => "app_v1", :compress => true }
dc = Dalli::Client.new('localhost:11211', options)
cache_key = 'foo-' + session.id
@data = dc.fetch(cache_key) do
do_some_api_call
end
您也可以使用视图片段和常规轨道低级缓存来执行此操作。请注意,模型不支持会话。
请参阅: