⚠️本章节记录缓存的一些方法的用法案例,配合这篇博客一起阅读:https://i.cnblogs.com/EditPosts.aspx?postid=8776632 

前置种子

https://github.com/stympy/faker

如有个Company模型,含有一个name属性。弄出三十个实例变量:

30.times do
  company = Company.create(:name => Faker::Company.unique.name)
  if company.save
    SecureRandom.random_number(100).times do
      company.employees.create(
        first_name: Faker::Name.first_name,
        last_name: Faker::Name.last_name,
        phone_number: Faker::PhoneNumber.phone_number
      )
    end
  end
end

Faker::Company是内置的类。

unique方法让name的值都是唯一的。

SecureRandom是一个module,random_number(100)在100内生成随机整数。


HTTP Caching

目的:加快下载速度,如果已经从服务器下载了网页,并得知没有变化,那么就不从新下载网页

网页浏览器知道当它下载了一个resource(a web page),会把它放入它的cache。在第二次请求request,浏览器传递这个信息给服务器:If-Modified-Since: header 。服务器会把这个信息和相关文件比较,然后发送新版本或者返回一个HTTP 304 not Modified file 作为response.


fresh_when方法 

在控制器中添加:

  def show
    fresh_when last_modified: @company.updated_at

#也可以简写etag: @company

  end

看log:显示:

第一次Completed 200 OK in 34ms (Views: 31.6ms | ActiveRecord: 0.5ms)

再刷新:  304 Not Modified in 1ms (ActiveRecord: 0.1ms)


curl is a tool to transfer data from or to a server

curl [option/url]

https://github.com/curl/curl

$ curl -I http://localhost:3000/companies/1

option:

-I,仅仅显示头部。

-i, -include  显示Include the HTTP response headers in the output

-v, 显示几乎全部信息,包括网页的html 。对debug有帮助.


当前用户:current_user and other potential parameters

ActionController::ConditionalGet::ClassMethods#etag

给etag增加指定的条件,当考虑是否更新时,看是否是当前用户的关联对象。

class ApplicationController < ActionController::Base
  etag {current_user.try :id}

#在具体的控制器中,首行写上也可以。

end
 

Stale?方法

和fresh_when的区别是可以指定respond_to的格式,如json.

  def show
    # fresh_when last_modified: @company.updated_at
    if stale? @company
      respond_to do |format|
        format.html
        format.json {render json: @company}
      end
    end
  end

expires_in 方法

用于设置缓存过期的时间。expires_in(20.minutes)就是20分钟后过期。

def show

 expires_in 2.minutes

fresh_when @company, public: true

end

$ curl -I <url>

HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: strict-origin-when-cross-origin
Date: Sun, 10 Jun 2018 11:41:47 GMT
ETag: W/"404a3742ba49f816596aab7b1858d68c"
Last-Modified: Sun, 10 Jun 2018 10:03:29 GMT
Content-Type: text/html; charset=utf-8
Cache-Control: max-age=120, private  #这是设置120秒后过期。


fragment cache

使用碎片缓存可以单独缓存部分视图页面。碎片缓存和HTTP caching已经page caching是可以一起使用的。

$ rails dev:cache

#⚠️在开发模块手动打开碎片缓存功能。而在产品模式,碎片缓存是默认使用的。

把整个表格都包含进去 cache('table_of_all_companies' )

<% cache('name_of_cache') do %>

[...]

<% end %>


Deleting the Fragment Cache

如果使用碎片缓存的话,在after_create, after_update, before_destroy上清除对应的缓存,使用AbstractController::caching::fragment  expire_fragment方法

class Employee < ActiveRecord::Base  ⚠️Company 模块也要➕上

belongs_to :company, touch: true

  after_create   :expire_cache
after_update :expire_cache
before_destroy :expire_cache

def expire_cache

ActionController::Base.new.expire_fragment('table_of_all_companies')

end

end

扩展:

ActionControllers是web请求的核心。它们由多个action组成,在request中执行并渲染一个模版或者redirects to 另外的action。

默认, ApplicationController继承自ActionController::Base。所有其他的controller继承它。

所有的methods都由2个基本的模式: Get-and-show, do-and-redirect.

备注:我觉得无需使用这个。因为fresh_when中会判断是否发生变化。 的确,见下节

缓存cache(5.2新:redis): gem faker (6600✨) 命令行工具curl(系统内置,可在git上看到文档)的更多相关文章

  1. Redis进阶实践之十四 Redis-cli命令行工具使用详解

    转载来源:http://www.cnblogs.com/PatrickLiu/p/8508975.html 一.介绍 redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西.现在redi ...

  2. Redis进阶实践之十四 Redis-cli命令行工具使用详解第一部分

    一.介绍       redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西.现在redis的东西要看的都差不多看完了.网上的东西也不多了.剩下来就看看官网的东西吧,一遍翻译,一遍测试. ...

  3. MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具

    这里向大家介绍一个新的生成T-SQL脚本的SQL Server命令行工具:mssql-scripter.它支持在SQL Server.Azure SQL DB以及Azure SQL DW中为数据库生成 ...

  4. 使用命令行工具npm新创建一个vue项目

    使用vue开发项目的前期工作可以参考前面写的:  Vue环境搭建及node安装过程整理 Vue.js 提供一个官方命令行工具,可用于快速搭建大型单页应用.该工具提供开箱即用的构建工具配置,带来现代化的 ...

  5. Redis 命令行工具能这样用你知道了吗?

    我们天天都在使用 Redis 内置的命令行工具 redis-cli,久而久之以为它就是一个简单的交互式 Redis 数据结构手工操作程序,但是它背后强大的功能绝大多数同学可能闻所未闻.本节我们一起来挖 ...

  6. Redis - 命令行工具

    使用Redis内置的命令行工具 redis-cli一些便捷的命令: 1.执行单条命令 平时在访问 Redis 服务器,一般都会使用 redis-cli 进入交互模式,然后一问一答来读写服务器,这种情况 ...

  7. Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)

    一.介绍           今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分.话不多说,开始我们今天的讲解.如果要想看第一篇文章,地址如下:http: ...

  8. Azure CLI 2.0-Azure新命令行工具介绍

    Azure CLI 2.0 是 Azure 的新命令行体验,用于管理 Azure 资源. 可以将其安装在 macOS.Linux 和 Windows 上,然后从命令行运行它. Azure CLI 2. ...

  9. 重磅!GitHub官方开源新命令行工具

    近日,GitHub 发布命令列工具 (Beta) 测试版,官方表示,GitHub CLI提供了一种更简单.更无缝的方法来使用Github.这个命令行工具叫做GitHub CLI,别名gh. 现在,你就 ...

随机推荐

  1. couldn't connect to host

    “couldn't connect to host” 这样的错误可能是主机不可到达,或者端口不可到达. ping OK只代表主机可以到达. 端口不可到达可能是由于HTTP 服务器未启动或者监听在其他端 ...

  2. 关于typecho,404页面错误

    之前用typecho,但是没发现404错误页面; 现在只要发布文章就提示404页面错误. 解决方法 点击发布日期,将发布日期的分向后拖动几分钟: 然后发布,发现404错误不见了: 我是遇到这种情况了不 ...

  3. pta 天梯地图 (Dijkstra)

    本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...

  4. Mysql的存储引擎和索引

    可以说数据库必须有索引,没有索引则检索过程变成了顺序查找,O(n)的时间复杂度几乎是不能忍受的.我们非常容易想象出一个只有单关键字组成的表如何使用B+树进行索引,只要将关键字存储到树的节点即可.当数据 ...

  5. 【mlflow】打包:npm run build + python setup.py sdist

    mlflow是一个开源机器学习平台 最近需要使用一个它的最新版本,但是这个最新版本没有git包,无法通过pip install安装,需要打包安装. 打包完之后在项目的dist文件夹中有打包后的压缩包, ...

  6. Python开发【笔记】:探索Python F-strings

    F-strings 在python3.6.2版本中,PEP 498 提出一种新型字符串格式化机制,被称为“字符串插值”或者更常见的一种称呼是F-strings(主要因为这种字符串的第一个字母是f) 简 ...

  7. Python开发【笔记】:接口

    接口 什么是接口 ? 接口只是定义了一些方法,而没有去实现,多用于程序设计时,只是设计需要有什么样的功能,但是并没有实现任何功能,这些功能需要被另一个类(B)继承后,由 类B去实现其中的某个功能或全部 ...

  8. Linux中的Buffer Cache和Page Cache echo 3 > /proc/sys/vm/drop_caches Slab内存管理机制 SLUB内存管理机制

    Linux中的Buffer Cache和Page Cache echo 3 > /proc/sys/vm/drop_caches   Slab内存管理机制 SLUB内存管理机制 http://w ...

  9. js-template-art【二】语法

    参看地址 一.模板语法 1.变量使用与输出 <% if (user) { %> <h2><%= user.name %></h2> <% } %& ...

  10. 关于RxJava背压

    http://flyou.ren/2017/04/05/%E5%85%B3%E4%BA%8ERxJava%E8%83%8C%E5%8E%8B/?utm_source=tuicool&utm_m ...