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

总结Web应用中常用的各种Cache

文章以Nginx,Rails,Mysql,Redis作为例子,换成其他web服务器,语言,数据库,缓存服务都是类似的。 以下是3层的示意图,方便后续引用: ?...1.客户端缓存 一个客户端经常会访问同一个资源,比如用浏览器访问网站首页或查看同一篇文章,或用app访问同一个api,如果该资源和他之前访问过的没有任何改变,就可以利用http规范的304 Not...动态请求静态文件化 在rails请求完成以后,结果保存成静态文件,后续请求就会直接由nginx提供静态文件内容,用after_filter来实现一下: class CategoriesController...的cache_key方法也是用updated_at,你也可以加入更多的参数,比如article上有评论数的counter cache,更新评论数的时候不会更新文章时间,可以这个counter也加入到key...rails内置了query cache (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters

4.7K40

慢的不是 Ruby,而是你的数据库

其中一个 Rails 的问题是它与数据库的高度耦合(也可以说是一种好处)。Rails 专注于掌控数据库的一切。没有数据库Rails 毫无用处,甚至可能阻碍工作进展,不是提供帮助 [2]。...在对整个 Rails 进行全面基准测试之前,我们先来审视一下 Rails 的 ORM:ActiveRecord。...我推测,ActiveRecord 采用了一种更高效的策略, Postgresql 的日期时间转换为本地 DateTime。 尽管如此,Ruby 的糟糕性能相对来说并不重要。...针对 Rails 的基准测试已经进行了许多次。我现在获得更多元数据,不是继续讨论整个堆栈的 “基准” 和火焰图。少谈数字,多谈概念。因为对于 Rails,我确信性能问题是概念性的。...如上所述,技术性能问题是由 Ruby 不是 Rails 引起的。 ActiveRecordRails 的实现,而非模式 per-sé)是对系统(关系数据库)的抽象,需要大量详细知识来保持性能。

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

如何在Ubuntu 14.04上使用Git Hooks部署Rails应用程序

介绍 在本教程,我们向您展示如何使用Git hooks自动Rails应用程序的生产环境部署到远程Ubuntu 14.04服务器。...使用Git hooks允许您通过简单地更改推送到生产服务器来部署应用程序,不必手动拉动并执行诸如执行数据库迁移之类的操作。...您还需要一个在本地开发机器上的git存储库管理的Rails应用程序。如果您没有并希望跟进,我们提供一个简单的示例应用程序。 让我们开始吧!...当我们gem添加到应用程序的Gemfile时,需要运行此bundle install命令。由于安装步骤因操作系统而异,因此这是留给读者的练习。...添加Production Git Remote 现在我们已经在生产服务器上设置了所有内容,让我们生产git remote添加到我们的应用程序的存储库

2.5K60

如何从 MongoDB 迁移到 MySQL

目前团队的成员没有较为丰富的 Rails 开发经验,所以还是希望使用 ActiveRecord 加上 Migration 的方式对数据进行一些强限制,保证数据库数据的合法。 ?...使用 csv 的方式导出数据在绝大多数的情况都不会出现问题,但是如果数据库的某些文档存储的是富文本,那么虽然在导出数据时不会出现问题,最终导入时可能出现一些比较奇怪的错误。...当我们准备数据库彻底迁移到 MySQL 之前,需要做一些准备工作,最后迁移所需要的工作尽可能地减少,保证停机的时间不会太长,准备工作的目标就是尽量消灭工程复杂的数据结构。...代码的迁移 Mongoid 在使用时都是通过 include 将相关方法加载到当前模型的, ActiveRecord 是通过继承 ActiveRecord::Base 的方式使用的,完成了对数据的预处理...这段代码的作用仅在这个脚本运行的过程才会生效,不会对工程的其他地方造成任何的影响;同时,该脚本会在每 1000 个模型插入成功后向标准输出打印当前进度,帮助我们快速发现问题和预估迁移的时间。

5.1K52

PHP将死。何以为继?

就在我这个顽固的PHP分子正要把一个现有的Ruby on Rails代码库转换成PHP时,我要说这样的话。 历史在重演 我认为PHP亡,因为我以前见到过。大概十年之前,PHP灭掉了Perl。...同时PHP往往是用在只要20行代码就能写出一个网页的地方,如今却是如果你不使用什么MVC框架之类的东西就会被认为没有把事 情做对。...我可以让Rails跑的跟PHP一样快,但那需要提供2到4倍高的硬件条件。我 估计五年内还会这样,五年后我也许不必把程序移植到PHP。但现在,它不能满足我的要求。...我 之前曾解释过为什么我认为这数据库上的ORM不是个好做法,所以我不会再重复解释,但有一点我需要总结的就是你省去了手工写CRUD所获得的效能要大于 ActiveRecord做傻事所损失的效能,要花时间搞清楚它是怎么工作的...Ruby on Rails很好,但并不比一个PHP之上的类似的MVC框架强多少,更别提由于Ruby自身的效率不高和ActiveRecord的ORM恶搞带来的双重 打击。

1.5K60

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

数据持久化 - 数据落地,比如存储到MySQL,MongoDB等不同的数据库。 计算机只有0、1,ORM却有两个功能,又多了个吵架的理由。...用ActiveRecord ORM的PHP框架有Laravel, Yii, CodeIgniter, CakePHP等。其他语言用的有 Ruby on Rails,Django等。...Data Mappers带来的好处主要体现在后期,比如需要优化性能,我们可以一次请求的所有SQL批量执行,这些SQL统一放在全局持久化对象,很方便就能实现批量处理操作。...这在ActiveRecord很难做到。拿到持久化对象之后对数据的干预也会非常方便,例如MySQL表的字段类型从枚举变成了int,在ActiveRecord你需要查找所有代码,将该字段修正。...Data Mappers只需要在持久化对象做个替换。 看一个调用实例: <?

2.1K50

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

介绍 Rails是一个用Ruby编写的开源Web应用程序框架。Nginx是一种高性能HTTP服务器,反向代理和负载均衡器,以其并发性,稳定性,可伸缩性和低内存消耗著称。...安装您将在Rails应用程序中使用的数据库。...由于有许多数据库可供选择,我们不会在本教程中介绍它们。 第三步 - 安装RVM和Ruby 我们不会直接安装Ruby。相反,我们将使用Ruby版本管理器。...在您的本地终端会话: $ ssh-keygen -t rsa 本地SSH密钥添加到服务器的授权密钥文件(请记住端口号替换为您的自定义端口号): $ cat ~/.ssh/id_rsa.pub |...首先将这些行添加到Gemfile Rails应用程序: Gemfile group :development do gem 'capistrano', require: false

5K40

分布式 PostgreSQL 集群(Citus)官方教程 - 迁移现有应用程序

schema 以分布列包含在键。...为了防止在生产中启动后才遇到此类问题,可以设置一个配置值来记录命中多个分片的查询。在正确配置和迁移的多租户应用程序,每个查询一次只能命中一个分片。...应用程序置于维护模式,并禁用对旧数据库的任何其他写入。 使用 pg_dump 原始生产数据库的数据保存到磁盘: 使用 pg_restore 导入 Citus: 测试应用。 运行。...Citus Warp 允许您在更改发生时更改从 PostgreSQL 源数据库流式传输到 Citus Cloud 集群。就好像应用程序自动写入两个数据库不是一个,除非具有完美的事务逻辑。...由于复制过程的性质,序列值不会在目标数据库上正确更新。为了获得正确的序列值,例如 id 列,您需要在打开对目标数据库的写入之前手动调整序列值。 一旦这一切完成,应用程序就可以连接到新数据库了。

2.1K30

大道缓存1 缓存特征2 缓存介质3 缓存分类和应用场景缓存实战

缺点仅限于类的自身作用内,类间无法共享缓存。...除了在ReferenceEntry数组项组成的,在一个Segment,所有ReferenceEntry还组成access(accessQueue)和write(writeQueue)(后面会介绍作用...,如果是已存在的节点,则将该节点链接的尾;对remove操作,直接从该移除该节点;对poll操作,头节点的下一个节点移除,并返回。...按照用户投票和时间排序:排行榜,得分会随着时间变化。LPUSH和LTRIM命令结合运用,把文章添加到一个列表。...SADD不会将已经存在的成员添加到一个集合。 Pub/Sub:在更新中保持用户对数据的映射是系统的一个普遍任务。

77321

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

最显著的地方是应用程序周围的输出和外部子系统,例如数据库或缓存 如果应用程序发出日志,那么可以识别日志包含的内容,并查看是否可以使用这些内容来衡量应用程序的行为 8.2.6 监控应用程序示例 mwp-rails...test_histogram, 'A test histogram') test_summary = prometheus.summary(:test_summary, 'A test summary') 监控添加到...在示例,我们通过以config.ru文件内添加exporter(和中间件收集器)来启用指标端点 代码清单:Prometheus添加到config.ru文件 require 'prometheus/...惧器一些HTTP服务器指标添加到通过Rack中间件收集的端点 代码清单:Rails的/metrics端点 ? 使用指标 现在应用程序已生成指标,我们可以在Prometheus中使用它们。...让我们创建一个作业来抓取/metrics端点,然后把Rails服务器添加到基于文件的服务发现,按主机名添加3个Rails服务器 代码清单:Rails服务器的服务发现 ?

4.5K11

4.2 执行上下文与作用

let const的顶级声明不会定义在全局上下文,但在作用解析上效果是一样的。...作用 上下文代码执行时,会创建变量对象的一个作用。决定了各级上下文中的代码在访问变量和函数时的顺序。代码正在执行的上下文变量对象始终位于作用的最前端。...全局上下文的变量对象始终是作用的最后一个变量对象 作用增强 执行上下文主要有全局上下文和函数上下文两种。但也有其他方式来增强作用。如:with语句会向作用前段临时添加指定的对象。...debug=true"; // withlocation对象作文上下文,location被添加到作用前段 width(location){ //href实际上是loation.href...var 使用var声明变量时,变量被自动添加到最接近的上下文。在函数,最接近的上下文就是函数的局部上下文。

32920

对单体系统优缺点评判到位:拆分Shopify单体工程的经验分享

在Ruby on Rails尤其如此,由于应用程序级别的所有代码的全局可用性,非常适合构建单体。...由于所有代码都部署在一个应用程序,因此数据都可以存储在单个共享数据库。每当需要一个数据时,它就是一个简单的数据库查询来检索它。 由于单体部署在同一个地方,因此只需要管理一组基础设施。...我们的代码库经过了充分的测试,因此通过在本地和CI运行我们的测试不会出现故障,以及在本地和分段上运行尽可能多的功能,我们能够确保没有遗漏任何东西。...隔离依赖关系 下一步是通过业务彼此分离来隔离依赖关系。每个组件都定义了一个干净的专用接口,其边界通过公共API表示,并对其关联数据进行独占所有权。...然后,我们按组件对调用者和被调用者进行排序,仅选择跨组件边界的调用,并将它们发送到Wedge。除了这些调用之外,我们还会从代码分析中发送一些其他数据,例如ActiveRecord关联和继承。

1.5K30

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

十多年前,与当时的大多数 Web 应用程序一样,GitHub 也是一个使用 Ruby on Rails 开发的网站,它的大部分数据都保存在 MySQL 数据库。...例如,我们单独某些功能的数据保存在独立的 MySQL 数据库;我们增加了读副本数量,读负载分摊到多台机器上;我们还使用了 ProxySQL,减少主 MySQL 实例打开的连接数。...在应用层进行数据连接,不是在数据库层,这也是一种常见的解决方案。...对于那些对事务一致性要求很高的地方,我们数据抽取到同属一个模式领域的新表。这样可以确保它们位于同一个数据库集群,继续享有事务一致性保证。...有了 ProxySQL,我们可以快速改变数据库的流量路由,将对客户端(也就是我们的 Rails 应用程序)的影响降到最低。 基于这样的结构,我们可以很自然地数据库连接迁移到 cluster_b。

1.5K11

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

Citus 允许用户编写多租户应用程序,就好像他们连接到单个 PostgreSQL 数据库一样,实际上该数据库是一个水平可扩展的机器集群。...() 基本上,当在数据库执行的结果 SQL 在每个表(包括 JOIN 查询的表)上包含 WHERE company_id = :value 子句时,Citus 识别出该查询应该路由到单个节点,并按原样在那里执行...此外,为了更简单,您可以使用我们的 Railsactiverecord-multi-tenant 库或 Django 的 django-multitenant 库,它们会自动这些过滤器添加到您的所有查询...例如,一个使用我们广告数据库的租户应用程序可能希望通过点击存储跟踪 cookie 信息,另一个租户可能关心 browser agents。...标准分片重新平衡提高整体性能,但它可能会或可能不会改善大小租户的混合。再平衡器只是分配分片以均衡节点上的存储使用,不检查在每个分片上分配了哪些租户。

3.8K20

面试分享:阿里前端面试总结

let 为 ES6 新添加申明变量的命令,它类似于 var,但是有以下不同: var 声明的变量,其作用为该语句所在的函数内,且存在变量提升现象 let 声明的变量,其作用为该语句所在的代码块内,不存在变量提升...引擎遇见a=2时同样会询问在当前的作用下是否有变量a,若存在,则将a赋值为2(由于第一步编译器忽略了重复声明的var,且作用域中已经有a,所以重复声明会发生值得覆盖不会报错)。...若不存在,则顺着作用向上查找,若最终找到了变量a则将其赋值2,若没有找到,则招呼作用声明一个变量a并赋值为2。 参考链接 封装一个函数,参数是定时器的时间,.then执行回调函数。...当客户端请求某个资源时,获取缓存的流程如下: 先根据这个资源的一些 http header 判断它是否命中强缓存,如果命中,则直接从本地获取缓存资源,不会发请求到服务器; 当强缓存没有命中时,客户端会发送请求到服务器...,服务器通过另一些request header验证这个资源是否命中协商缓存,称为http再验证,如果命中,服务器请求返回,但不返回资源,而是告诉客户端直接从缓存获取,客户端收到返回后就会从缓存获取资源

63030

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

他的作用是主键注解,标记当前属性映射表的主键,其中type是属性指定的主键类型,他有这几个值: IdType.AUTO:数据库ID自增。...,或者是说实体类中有的字段数据库却没有,我们需要用@TableField这个注解。...@TableField注解用于标记非主键字段,他的作用是指定当前属性映射数据库表哪一列, 默认是跟属性名一致。...7.1、什么是ActiveRecord     ActiveRecord也属于ORM(对象关系映射)层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。...ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD。

2.1K30
领券