ruby-on-rails - 如何获取在多个Rails版本应用程序中连接的Redis数据?

标签 ruby-on-rails redis

我正在使用Redis缓存在Rails应用程序中获取数据。简单地说,我有两个应用程序,第一个基于 rails 4 ,第二个基于 rails 6 。我必须在两个应用程序中使用缓存数据。

在rails 4应用程序中:-我已经在rails 4应用程序中创建了缓存,并成功获取了数据。

Rails.cache.fetch("test_cache"){User.last}
=> #<User id: 100973, email: "xxxx.com", encrypted_password: "$2a$10$D8aOhoSWvNWeEQE2swAX2OEVIF5H0aY8sR/fGVQ3BhU...........> 

在rails 6应用程序中:-但是当我想在rails 6应用程序中加载相同的缓存时,出现错误。
Rails.cache.fetch("test_cache"){User.last}
Traceback (most recent call last):
        2: from (irb):18
        1: from (irb):18:in `rescue in irb_binding'
NameError (uninitialized constant ActiveRecord::AttributeSet)
Did you mean?  ActiveRecord::Attributes

然后我来到一个解决方案,as_json保存数据
Rails.cache.fetch("test_cache"){User.last.as_json}

可以成功工作并在两个应用程序上都获取了数据,但是还有另一个问题,我该如何访问model methods, associations etc etc...

有什么建议或想法吗?

最佳答案

对于缓存中的非字符串值,Rails使用Marshal.dump(并通过deflate对其进行压缩)。可以将编码数据视为数据和代码之间的某种东西,因为它引用了类名和内部结构。这就是它有局限性的原因:只能使用相同的ruby版本(请参阅ruby docs on that)将其解码,并且应用程序应具有相同的类。

显然,轨道4和轨道6中的ActiveRecord::Base结构不同,因此在编码时不兼容。

为了具有兼容性,您唯一的选择是仅缓存基本的 ruby 类型和PORO,这些类型和PORO不会引用应用程序中不同的任何类。您尝试使用as_json确实做到了-存储模型的Hash表示。

但是实际上第一步是重新考虑到底要缓存什么以及为什么要缓存,这里有几点需要考虑:

  • 当然,Redis / Memcache速度很快,但是对其进行访问仍然是具有相应开销的数据库查询。从SQL DB进行简单读取(如User.find(primary_key_value_here))几乎一样快。
  • AR模型具有用于关联的缓存,您可能还拥有一些已记录的数据,您可能会遇到这些
  • 的数据停顿的情况
  • 访问非缓存的关联仍将导致数据库调用
  • 最有可能您不是要缓存模型本身,而是要更轻松地查找模型(例如,如果它是某些昂贵的计算的结果)或某些派生数据的方法。在前一种情况下,存储记录ID就足够了;在后一种情况下,您可以将哈希/ PORO之类的东西与所需的所有数据一起存储,例如:

  • hash = Rails.cache.fetch("last_registered_user"){
      User.last.yield_self{|u|
        {
          user_id: u.id,
          name: u.name,
          registered_at: u.created_at,
          invited_by: u.invited_by.name
        }
      }
    }
    

    关于ruby-on-rails - 如何获取在多个Rails版本应用程序中连接的Redis数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59750078/

    相关文章:

    mysql - 这是在 Rails 上使用 ruby​​ 的合适时机吗?

    security - Redis配置,需要允许远程连接但需要安全

    redis:- 获取键的修改设置值

    ruby-on-rails - Webmock 未通过查询响应 stub 请求

    ruby-on-rails - 如果快速规范通过,如何让守卫只运行慢速规范

    c# - 线程环境下的redis不一致

    amazon-web-services - 找不到 AWS ElasticCache 配置端点 IP 地址

    python - 查询任务状态——Celery和redis

    ruby-on-rails - 索引 View 中的新操作

    ruby-on-rails - carrierwave uploader 上传文件,但仍然提供 default_url