Rails 中如何让 Low-Level caching 与 Association caching 协同工作?

2024-03-02

我目前正在开发一个使用 Rails 5 的项目。我想提高性能,所以我决定使用低级缓存,如下所示:

class User < ApplicationRecord
  has_one :profile

  def cached_profile 
    Rails.cache.fetch(['Users', id, 'profile', updated_at.to_i]) do
      profile
    end
  end
end

class Profile < ApplicationRecord
  belongs_to :user, touch: true
end

分别工作得很好。但现在我想让两个缓存协作。我想要的是,一旦从缓存存储(这里是redis)检索关联对象,就不需要从数据库检索它。

irb> u = User.take
irb> u.cached_profile # fetch from the redis. Can I set the association caching in `cached_profile`?
irb> u.profile # fetch from the database
  Profile Load (1.4ms) SELECT  "profiles".* FROM "profiles" WHERE "profiles"."user_id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
irb> u.profile # fetch from the association caching

u.profile不应该从数据库中获取,因为它已经从redis中检索,如何实现这一点?

更新1:

我发现有一个实例变量@association_cache在实例中ActiveRecord::Base,它存储缓存的关联并确定是否应从数据库检索关联。

我想我可以做类似的事情user.instance_variable_get(:@association_cache)['profile'] = cached_profile使其发挥作用。但其中的价值@association_cache是一个实例ActiveRecord::Associations::HasOneAssociation我不知道如何构建user目前。


您可以直接覆盖profile应用低级缓存的方法。

class User
  has_one :profile

  def profile 
    Rails.cache.fetch(['Users', id, 'profile', updated_at.to_i]) do
      super
    end
  end
end

class Profile
  belongs_to :user, touch: true
end

但要小心,因为你可能会遇到一些意外。您应该更新上的缓存profile=例如,二传手也是如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 中如何让 Low-Level caching 与 Association caching 协同工作? 的相关文章

随机推荐

  • C#:接口中的枚举

    我见过几个与此问题类似的线程 但没有一个真正回答我想问的问题 对于初学者来说 不幸的是 我正在使用现有的 API 代码 虽然可能有更好的方法来完成我所要求的事情 但我只能以类似的方式进行操作 因为向后兼容性是非 可以协商 我有一个响应类 当
  • 具有 RESTful JSON 服务、HTML5 和 jQuery ajax 的 Java Web 框架

    快到 2013 年了 HTML5 时代到来了 jQuery 是 Web Javascript 的事实上的标准 此链接适用于 2010 年 https stackoverflow com questions 3882082 rest json
  • Android 中的线程示例 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想要一些关于 android 中线程创建和调用线程的简单示例 这是一个很好的教程 http andr
  • Mac 上 Eclipse 的键盘设置

    我已经在大学完成了第一门 Java 课程 想在自己的计算机上练习 然而 在下载 Eclipse 并能够编写非常简单的程序后 当我尝试编写接受用户输入的程序时 我遇到了障碍 例如 Keyboard in readInteger 因为 Keyb
  • 从 React 上传 Cloudinary 图像:我包含 Cloudinary 未签名预设,但得到“使用未签名上传时必须指定上传预设”

    我正在尝试基于此 codepen 示例构建一个简单的 Cloudinary 图像上传 https codepen io team Cloudinary pen QgpyOK https codepen io team Cloudinary
  • 开发者工具无法在 Chrome osx 中运行

    尝试在 Chrome 中打开开发人员工具 无论是通过主菜单还是通过检查元素上下文选项 我看到检查器窗口闪烁 然后消失 每次 这是怎么回事 有没有办法在不删除我的个人资料的情况下重置开发人员工具配置 我在 Apple MacBook Pro
  • Android 3.0中如何强制用户在密码过期超时后更改密码?

    我试图使用 Android 密码过期功能DeviceAdmin 当我打电话时setPasswordExpirationTimeout API 仅此而已 发送通知但实际上并不强制用户更改 密码 它仅在超时后发送通知 V DevicePolic
  • 如何在 Flask 中重定向到外部域?

    在我的 Flask 应用程序中完成操作后 我需要重定向回外部 URL 代码看起来像这样 if form next data is not None return redirect form next data where form next
  • CSS 剪辑路径定位问题

    我使用 SVG 元素创建了一个相当简单的形状 然后使用该元素将其放入我的 CSS 中clip path 它应该使我的角变圆 但由于某种原因 只有 1 个角的效果完美 这是形状
  • 如何手动触发Laravel模型事件

    当没有数据更改时 laravel 检查 isDirty 并且从未执行更新查询 因此不会触发模型更新事件 我们如何手动触发事件 手动触发事件 user User findOrFail id user gt fill data user gt
  • 使用 Google App Engine 进行异步获取请求

    我正在阅读文档异步获取请求 https developers google com appengine docs python urlfetch asynchronousrequests在GAE中 Python 不是我的第一语言 因此我很难
  • 循环视图路径错误,Spring MVC

    我正在尝试做教程 gt http spring io guides gs serving web content http spring io guides gs serving web content 当我运行它时 它显示圆形视图路径 问
  • 使 Ruby 字符串不可变

    需要使我的程序中的某些 Ruby 字符串不可变 最好的解决方案是什么 写一个包装器String class The freeze方法对我不起作用 我看到freeze不允许您解冻该对象 以下是我的情况 我有一个类将字符串传递给回调 该字符串恰
  • PHP for 循环中允许的内存大小耗尽

    当我尝试在 PHP 中操作一个巨大的数组并将结果作为响应返回时 我遇到了致命错误HTTP POST 请求 允许的内存大小 536870912 字节已耗尽 我已经尝试过设置ini set memory limit 1 为了看看我是否得到结果
  • 如果绑定源为空,如何为图像设置默认源?

    我正在使用绑定作为源Image控制
  • 在eclipse中使用jsr305注释Findbugs没有发现bug

    我一直在尝试将 jsr 305 注释与 Findbugs 一起使用 特别是 CheckForNull 注释 它可以避免我刚刚发现的向客户报告的错误 我已将 jsr305 jar 和annotations jar 添加到我的构建路径中 但 f
  • 安排大 ETA 的 celery 任务

    我目前正在使用 celery 尝试未来的任务ETA http docs celeryproject org en latest userguide calling html eta and countdown功能和 Redis 代理 使用
  • 减少 Mercurial 中的存储库大小

    当我的团队使用 Mercurial 存储库中的源代码处理给定项目时 存储库的大小显然在增长 因此 通过网络克隆存储库变得越来越慢 是否有任何技术可用于删除较旧的提交或减小存储库的大小 以使克隆操作在慢速网络上更快 我们使用 Tortoise
  • 查找列表中最流行的单词

    我有一个单词列表 words all awesome all yeah bye all yeah 我想获得一个元组列表 3 all 2 yeah 1 bye 1 awesome 每个元组在哪里 number of occurrences w
  • Rails 中如何让 Low-Level caching 与 Association caching 协同工作?

    我目前正在开发一个使用 Rails 5 的项目 我想提高性能 所以我决定使用低级缓存 如下所示 class User lt ApplicationRecord has one profile def cached profile Rails