gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:42:44 26 4
gpt4 key购买 nike

我正在使用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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com