【问题标题】:dalli session store达利会议商店
【发布时间】:2013-01-01 10:26:29
【问题描述】:

我已经在谷歌上搜索了很长时间,但还没有找到解决方案。我正在使用 Rails 3.2 和带有 memcached 1.4.14 的 Dalli gem。

我想使用 Dalli/Memcached 作为会话存储,但我不知道该怎么做。现在,Dalli 缓存像经典缓存一样工作,但不是会话缓存。我创建了一个新的 rails 应用程序,将 Dalli 添加到 Gemfile 中:

gem 'dalli'

在开发和生产环境中,我将 Dalli 设置为缓存存储:

config.cache_store = :dalli_store

这是initializers/session_store.rb的内容:

require 'action_dispatch/middleware/session/dalli_store'
Rails.application.config.session_store :dalli_store, :memcache_server => ['127.0.0.1'], :namespace => 'sessions', :key => '_session', :expire_after => 30.minutes

我创建了一个Myooo 模型,我在其中添加了列出和创建实例的方法:

def self.index_c
a = Rails.cache.read(:myooo_index)
if a.nil?
    puts '--->>> load again'
    a = Rails.cache.write(:myooo_index, Myooo.all, expires_in: 5.seconds)
else
    puts '--->>> using cache'
end
return Rails.cache.read(:myooo_index)
end

def self.create_c(myooo_object)
a = Rails.cache.read(:myooo_create)
if a.nil?
    a = Rails.cache.write(:myooo_create, myooo_object, expires_in: 10.minutes)          
end
return Rails.cache.read(:myooo_create)
end

在控制器中,我只是尝试访问缓存。在索引操作中:

@myooos = Myooo.index_c

在创建动作中:

@myooo = Myooo.new(params[:myooo])
Myooo.create_c(@myooo)

我知道这是一个奇怪的脚本,但我需要了解我应该如何处理会话缓存并在实际项目中使用它。我在服务器大纲控制台上花了很多时间,做了很多尝试来了解发生了什么。缓存的作用类似于经典缓存,而不是会话缓存。

我很高兴得到帮助(ps:新年快乐):)

【问题讨论】:

  • 通过会话存储,您应该了解用于持久化与用户 HTTP 会话对应的数据的存储。除了在您的初始化程序中,您显示的代码中没有任何内容与 HTTP 会话相关。你能澄清一下你想要达到的目标吗?
  • 只需使用session 将数据存储到用户的会话中(例如session[:user_profile]=@profile)。如果您需要缓存大量数据,您宁愿在选择缓存策略之前确定您的实际性能问题。 Rails 带有several builtin options 用于缓存。在您的情况下,部分缓存加上 key-based 过期策略(Memcached LRU eviction)可能值得考虑。
  • 感谢您的链接和帮助。我正在考虑解决它,因为你给我建议 session[:sess] = @asd 但我希望 dalli 或任何其他 gem 能解决这个问题,我不会管理会话和缓存。
  • 不,我尝试编写一些代码行并且我对这个问题有新的看法:1)缓存对会话一无所知,所以我必须制作可能的行来管理它......我可以使会话为零,但是当我询问缓存时,我得到了不对应的坏数据... 2)我无法在模型中使用会话,所以我的代码被传播到控制器(我管理会话的地方)和模型(在哪里我正在管理缓存)。
  • 所以我需要机制来处理。我已经在 github 中阅读了 dalli,并且有一些关于 session store 的内容,但没有文档说明如何操作。感谢您的帮助

标签: ruby-on-rails session dalli session-store


【解决方案1】:

(我写了更长的文本 cca 500 字符)是的,你是对的,我说的是this。我正在构建大型应用程序,大约 30 个 db 表,所有表都集中在用户表中(对我来说它很大,我从来没有在最大的项目中工作过)。当用户登录时,我想缓存用户声称的数据。有很多对数据库的查询,所以我想缓存它们。还有其他方法可以解决我的问题并且不使用存储在会话中的缓存数据吗?

create 的例子只是关于测试......(不是真正的测试,而是为我测试,如果它工作正常)在歌剧中我填写表格并调用 create 方法。我希望数据只会存储给使用 opera 的用户。看来,我做了这样的事情:

 <% a = Rails.cache.read(:myooo_create) %>
 <% if !a.nil? %>
 <%= a.myi %><br/>
 <%= a.mys %>
 <% end %>

但是当我转移到 Firefox 时,数据就在那里......所以我猜,这些数据没有保存在会话缓存中,而是保存在“常规缓存”中。 (当然,这个视图代码太糟糕了!但是对于dalli学习来说,它是好的;))

【讨论】:

    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多