首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

总结Web应用中常用各种Cache

1.客户端缓存 一个客户端经常会访问同一个资源,比如用浏览器访问网站首页或查看同一篇文章,或用app访问同一个api,如果该资源和他之前访问过没有任何改变,就可以利用http规范304 Not...,查询时候避免出现n+1问题: def eager_load_all ActiveRecord::Associations::Preloader.new([self], {:trip_days...数据查询缓存 通常来说web应用性能瓶颈都出现在DB IO上,做好数据查询缓存,减少数据库查询次数,可以极大提高整体响应时间。 数据查询缓存分2种: A....rails内置了query cache (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters...如果文章类别都不一样,就会出现N+1查询问题(常见性能瓶颈),rails推荐解决方法是用Eager Loading Associations ( http://guides.rubyonrails.org

4.7K40

不是 Ruby,而是你数据库

在对整个 Rails 进行全面基准测试之前,我们先来审视一下 Rails ORM:ActiveRecord。...这个例子展示了从表获取一记录操作,虽然它并非关系型数据库所擅长领域,但它揭示了 ORM 存在实际性能问题:缺乏连接、排序、过滤和计算等操作。...如上所述,技术性能问题是由 Ruby 而不是 Rails 引起ActiveRecordRails 实现,而非模式 per-sé)是对系统(关系数据库)抽象,需要大量详细知识来保持性能。...更实际情况是:几年前我为了修复一个 N+1 查询而加入 User.active.includes(:roles) 动态地选择它认为你需要内容。...大多数都是合理理由,除了最后一个:这是选择 Rails 一个可怕理由。

10730
您找到你想要的搜索结果了吗?
是的
没有找到

大型项目如何选择ORM:Active Record 还是 Data Mappers

这样带来好处是不言而喻,比如要insert一记录,原始做法是这样: INSERT INTO `user` (`id`, `account`, `password`) VALUES (1, 'it2048...account; } public function getAccount($account){ return $this->account; } } 需要插入一记录只需要...用ActiveRecord ORMPHP框架有Laravel, Yii, CodeIgniter, CakePHP等。其他语言用有 Ruby on Rails,Django等。...这在ActiveRecord很难做到。拿到持久化对象之后对数据干预也会非常方便,例如MySQL表字段类型从枚举变成了int,在ActiveRecord你需要查找所有代码,将该字段修正。...如何选择ORM 上面把ActiveRecord和Data Mappers都介绍清楚了,选择哪一个需要根据实际业务需求来。

2.1K50

分布式 PostgreSQL 集群(Citus)官方示例 - 多租户应用程序实战

由于应用程序查询仅限于单个租户,例如商店或公司,因此快速进行多租户应用程序查询一种方法是将给定租户所有数据存储在同一节点上。...() 基本上,当在数据库执行结果 SQL 在每个表(包括 JOIN 查询表)上包含 WHERE company_id = :value 子句时,Citus 将识别出该查询应该路由到单个节点,并按原样在那里执行...此外,为了更简单,您可以使用我们 Rails activerecord-multi-tenant 库或 Django django-multitenant 库,它们会自动将这些过滤器添加到您所有查询...发挥您想象力,以了解这些陈述将如何以您选择语言表达。 这是在单个租户上运行简单查询和更新。...记下其主机名, Cloud Console “Nodes” 选项卡中所示。

3.8K20

水货CTO入职不到半年犯下低级错误,将公司拖入无底深渊

1CTO 犯低级错误,CEO 来买单 黑客利用 SQL 注入漏洞从 Gab 后台数据库窃取了大约 70GB 平台用户数据,包含该网站 4000 多万帖子,之后将所盗走 70GB 数据交给了爆料网站...取而代之是,开发人员向包含 find_by_sql 方法 Rails 函数添加一个调用,该方法直接接受查询字符串未经清理输入。Rails 是一套广泛使用网站开发工具包。...上述批评者称,这一删除行为违反了一规定,即要求复刻(fork)源代码直接从网站上链接。该要求目的是提供透明度,让其他开源开发者也能从 Gab 同行工作受益。...这件事情也引起了开发者广泛关注,一位从事多年 Rails 开发网友说:“这是不好代码,让我感到惊讶是这是由一位 Facebook 工程师写(后来他成了 CTO)。...粗略检查就能看出一些错误,比如大型原始 SQL 查询完全可以使用 AREL 或 ActiveRecord 这种更惯用方式,没有清理用户输入等等。”

97620

何在Ubuntu 14.04上使用Puma和Nginx部署Rails应用程序

Puma是一个应用服务器,Passenger或Unicorn,它使您Rails应用程序能够同时处理请求。...在您喜欢文本编辑器打开应用程序数据库配置文件。...将生产密码和机密保存在应用程序代码库之外被认为是最佳实践,因为如果您使用是分布式版本控制系统(Git),它们很容易暴露出来。接下来我们将讨论如何使用环境变量设置数据库身份验证。 保存并退出。...rescue ActiveRecord::ConnectionNotEstablished ActiveRecord::Base.establish_connection(YAML.load_file...手动启动Puma应用程序 要立即启动所有托管Puma应用程序,请运行以下命令: sudo start puma-manager 您也可以使用pumaUpstart脚本启动单个Puma应用程序,如下所示:

5.3K10

yii2开发后记

我们用一个在models文件夹Operation.class里Operation类来继承yii\db\ActiveRecord来操作Operation表。...文件,而且其内部实现也多采用yii内置小部件形式,<?...yii里QUERY查询语句构造器非常简单好用,它可以用在模型和控制器,虽然可能会造成模型与表不对应,但其构成接近sql语句,使用它可以轻易写出复杂sql语句而不必严格遵从yii内置规则。...使用时应用基命名空间,use yii\helpers\XXX,然后用类来引用基静态方法XXX::YYY() 12.关联模型 yii里面的关联模型,用来在取得当前表内记录时,会取出对应表记录。...A表内每取出一信息,也取出B表中跟A表对应有信息,在ModelA里定义一个getBtable方法 function getBtable() { return $this->hasOne/hasMany

3.1K50

Ruby 应用容器封装踩坑记录(Lobsters)

将 Dockerfile ruby:2.4-alpine 调整至 ruby:2.7-alpine,记得注意第一回合里记录“路径细节”,再次尝试构建镜像。...bundle install --no-cache 添加两命令: + su lobsters -c "bundle update --bundler"; \ + su lobsters -c "gem...第六回合:升级 Bundler 到合适版本 迄今为止我们主要完成了下面两件事: 在 2.4.x 版本 ruby 镜像启动 lobsters 在 2.7.x 版本 ruby 镜像启动 lobsters...第七回合:升级 Rake 版本到合适版本 接着来解决 rake 版本问题,和 bundler 处理思路一样,非必要,不需要进行额外指定是最好。...虽然我们在容器首次进行安装,不需要清理缓存,但是考虑到官方镜像潜在 tricks,还是选择设置安装时不从缓存读取内容稳妥些。

4.7K00

Ruby 应用容器封装踩坑记录(Lobsters)

将 Dockerfile ruby:2.4-alpine 调整至 ruby:2.7-alpine,记得注意第一回合里记录“路径细节”,再次尝试构建镜像。...bundle install--no-cache 添加两命令: + su lobsters -c "bundle update --bundler"; \ + su lobsters -c...第六回合:升级 Bundler 到合适版本 迄今为止我们主要完成了下面两件事: 在 2.4.x 版本 ruby 镜像启动 lobsters 在 2.7.x 版本 ruby 镜像启动 lobsters...第七回合:升级 Rake 版本到合适版本 接着来解决 rake 版本问题,和 bundler 处理思路一样,非必要,不需要进行额外指定是最好。...虽然我们在容器首次进行安装,不需要清理缓存,但是考虑到官方镜像潜在 tricks,还是选择设置安装时不从缓存读取内容稳妥些。

7.4K10

如何从 MongoDB 迁移到 MySQL

目前团队成员没有较为丰富 Rails 开发经验,所以还是希望使用 ActiveRecord 加上 Migration 方式对数据进行一些强限制,保证数据库数据合法。 ?...如果准备使用 UUID 加生成器方式,其实会省去很多迁移时间,不过看起来确实不是特别的优雅,如何选择还是要权衡和评估,但是如果我们选择了使用 integer 类型自增主键时,就需要做很多额外工作了...,这样我们能够保证模型之间关系不会消失,并且数据行相对位置与迁移完全一致。...除了建立数据库迁移文件并修改基类,我们还需要修改一些 include 模块和 Mongoid 独有的查询,比如使用 gte 或者 lte 日期查询和使用正则进行模式匹配查询,这些查询ActiveRecord...除此之外,MongoDB 和 MySQL 之间选择也不一定是非此即彼,我们将项目中大部分数据都迁移到了 MySQL ,但是将一部分用于计算和分析数据留在了 MongoDB,这样就可以保证 MongoDB

5K52

多行日志收集管理搞不定?

JSON 保证多行日志作为单个事件进行处理最简单方法就是以 JSON 格式记录日志,比如下面是常规 Java 日常日志示例: # javaApp.log 2019-08-14 14:51:22,299...如果直接收集上面的日志会识别为多行日志,如果我们用 JSON 格式来记录这些日志,然后介绍 JSON 数据就简单多了,比如使用 Log4J2 来记录,变成下面的格式: {"@timestamp":"2019...例如,下面的配置表示让 Logstash 匹配你日志文件 ISO8601 格式时间戳,当匹配到这个时间戳时候,它就会将之前所有不以时间戳开头内容折叠到之前日志条目中去。...,我们可以在 模块添加一个 multiline 解析规则,必须包含一个 format_firstline 参数来指定一个新日志条目是以什么开头,此外还可以使用正则分组和捕获来解析日志属性...在 Fluentd 官方文档也有几个示例说明: Rails 日志 比如输入 Rails 日志如下所示: Started GET "/users/123/" for 127.0.0.1 at 2013

1.5K50

多行日志收集管理搞不定?

JSON 保证多行日志作为单个事件进行处理最简单方法就是以 JSON 格式记录日志,比如下面是常规 Java 日常日志示例: # javaApp.log 2019-08-14 14:51:22,299...如果直接收集上面的日志会识别为多行日志,如果我们用 JSON 格式来记录这些日志,然后介绍 JSON 数据就简单多了,比如使用 Log4J2 来记录,变成下面的格式: {"@timestamp":"2019...例如,下面的配置表示让 Logstash 匹配你日志文件 ISO8601 格式时间戳,当匹配到这个时间戳时候,它就会将之前所有不以时间戳开头内容折叠到之前日志条目中去。...,我们可以在 模块添加一个 multiline 解析规则,必须包含一个 format_firstline 参数来指定一个新日志条目是以什么开头,此外还可以使用正则分组和捕获来解析日志属性...在 Fluentd 官方文档也有几个示例说明: Rails 日志 比如输入 Rails 日志如下所示: Started GET "/users/123/" for 127.0.0.1 at 2013

82730

工作量减半开发神器,MyBatisPlus入门和部分源码讲解

常用于解决以下两个问题: 对象属性名和字段名不一致问题(非驼峰) 对象属性字段在表不存在问题 ?     他还有另一种用法,就是指定某个字段不加入查询。 ? ?...4.1、插入操作 4.1.1、方法定义     MyBatis-Plus对于insert方法定义是: /** * 插入一记录 * * @param entity 实体对象 */ int insert...User user : users) { System.out.println(user); } } 4.4.3、selectOne 4.4.3.1、方法定义 /** * 根据 entity 条件,查询记录...ActiveRecord     ActiveRecord也属于ORM(对象关系映射)层,由Rails最早提出,遵循标准ORM模型:表映射到记录记录映射到对象,字段映射到对象属性。...ActiveRecord主要思想是: 每一个数据库表对应创建一个类,类每一个对象实例对应于数据库中表一行记录;通常表每个字段 在类中都有相应Field。

2.1K30

《Prometheus监控实战》第8章 监控应用程序

第8章 监控应用程序 首先,考虑一些高级设计模式和原则 ---- 8.1 应用程序监控入门 应用程序开发存在一种常见反模式,即把监控和其他运维功能(安全性)视为应用程序增值组件而非核心功能。...,这样就可以对监控和指标进行分区 8.1.1 从哪里开始 开始为应用添加监控,一个不错选择是程序入口和出口。...(支付网关) 测量作业调度、执行和其他周期性事件(cron作业)数量和时间 测量重要业务和功能性事件数量和时间,例如正在创建用户或者支付和销售等交易 8.1.2 监控分类 你应该通过应用程序、...对于长期业务指标,在许多情况下,你可能会使用基于事件系统 8.2.1 应用程序指标 应用程序指标可以衡量应用程序性能和状态,包括应用程序最终用户体验,延迟和响应时间 提示:一些好衡量应用程序性能例子是之前提到...让我们创建一个作业来抓取/metrics端点,然后把Rails服务器添加到基于文件服务发现,按主机名添加3个Rails服务器 代码清单:Rails服务器服务发现 ?

4.5K11

GitHub 关系型数据库垂直分库实践

十多年前,与当时大多数 Web 应用程序一样,GitHub 也是一个使用 Ruby on Rails 开发网站,它大部分数据都保存在 MySQL 数据库。...模式领域就是指那些经常一起被用在查询(例如表连接和子查询)和事务数据库表集合。...以下是我们用来解决例外情况常用方法。 有时候,我们只需要把表连接查询拆成单独查询。例如,用 ActiveRecord preload 方法取代 includes 方法。...对于这种情况,我们提供了通用解决方案:has_many 新增了 disable_joins 选项,告诉 ActiveRecord 不要执行底层表连接操作,改为执行多次查询,并在查询之间传递主键值。...我们通常选择是“普通”技术,这些技术被证明很适合我们规模,因为对于我们来说,可靠性是最为重要

1.5K11

大道至简-Shopify 构建弹性支付系统 10 原则

5 实现结构化日志记录 将日志存储在集中地方,并使它们易于搜索。 指标提供了系统行为高级概述,而日志记录允许我们了解单个 Web 请求或后台作业内部发生事情。...在分布式系统,传递某种关联标识符很有用。一个假设例子是当买家在结账时启动支付,关联_id 由我们 Rails 控制器生成。 6 使用幂等键 确保支付或退款只发生一次,尽管偶尔会出现小故障。...在 Shopify 规模下,每一百万次不可靠支付处理机会意味着它每天发生很多次。如果这是超时支付 API 调用,他们希望重试请求,但要安全地进行重试。...7 与调节保持一致 在数据库存储与 Shopify 金融合作伙伴调节中断。 通过调节,他们确保自己记录与金融合作伙伴记录一致。...他们调节单个记录,费用或退款,以及尚未支付给商户的当前余额等汇总记录。 8 结合负载测试 如果传入工作数量足够大,他们服务器甚至会耗尽内存来存储队列上工作并崩溃。

10210

CentOS7安装维护Gitlab

日志 重置管理员密码 gitlab管理员密码忘记,怎么重置密码,Gitlab 修改root用户密码 使用rails工具打开终端 sudo gitlab-rails console production...查询用户email,用户名,密码等信息,id:1 表示root账号 user = User.where(id: 1).first 重新设置密码 user.password = '新密码...备份恢复 使用Gitlab一键安装包安装Gitlab非常简单, 同样备份恢复与迁移也非常简单,用一命令即可创建完整Gitlab备份: 修改备份文件默认目录 修改/etc/gitlab/...如果修改了,首先进入备份 gitlab 目录,这个目录是配置文件 gitlab_rails['backup_path'] ,默认为 /var/opt/gitlab/backups 。...2/2 Failed: gitlab-ce.x86_64 0:8.11.5-ce.0.el6 看上面一堆错误,瞬间就懵逼了,看到一救星命令让我尝试运行 sudo touch /etc/gitlab

5K30
领券