我正在使用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表示。
但是实际上第一步是重新考虑到底要缓存什么以及为什么要缓存,这里有几点需要考虑:
User.find(primary_key_value_here)
)几乎一样快。 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/