⚠️本章节记录缓存的一些方法的用法案例,配合这篇博客一起阅读: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. Oracle卸载之linux快速卸载rac脚本-一键卸载

    #!/bin/bash#Usage:Log on as the superuser('root') on node1,node2 cd /u01/app/11.2.0/grid/bin./crsctl ...

  2. talib 中文文档(十二):Pattern Recognition Functions K线模式识别,形态识别

    Pattern Recognition Functions K线模式识别,形态识别 CDL2CROWS - Two Crows 函数名:CDL2CROWS 名称:Two Crows 两只乌鸦 简介:三 ...

  3. spring自定义事务同步器(二):借助redisson实现自己的同步器

    1. 借助redis的java客户端redisson实现自己的事物同步器 @Override public void lockWithinCurrentTransaction(Object key) ...

  4. cocos2d首印象

    一. 创建工程 从 2.1.4 版本开始,官方就不再为 VS 提供模板了,逐步在各平台采用统一的 Python 脚本创建跨平台工程. 要创建工程,我们需要先从命令行进入 tools/project-c ...

  5. (2.13)Mysql之SQL基础——触发器

    (2.13)Mysql之SQL基础——触发器 关键词:Mysql触发器 1.一般形式 -- 0.查看触发器[1]SHOW TRIGGERS;[2]SELECT * FROM `information_ ...

  6. Executor框架与Thread

    Executor将线程的创建和线程的执行解耦,比较下面两个例子: 1:TaskExecutionWebServer.java package chapter06; import java.io.IOE ...

  7. JOJ1202。重新操刀ACM,一天一练!做个简单的题目温习。

    http://ac.jobdu.com/problem.php?pid=1202 题目描述: 对输入的n个数进行排序并输出. 输入: 输入的第一行包括一个整数n(1<=n<=100).   ...

  8. postman设置环境变量,字段值经过json转换后数值字节长度超过上限的问题

    在使用Tests进行环境变量的设置时,遇到这么一种情况,在返回的responseBody中的userId字段,字段返回的是数值类型,再经过json转换之后,发现保存的值跟接口返回的值不一致:如下图: ...

  9. java一些基本的方法

    一,Java中,next();和nextLine();有什么区别 举个例子,你就会明白了.如,你输入的一行:abc cde efg注意,其中abc和cde之间有空格,cde和efg之间也有空格这样,n ...

  10. 非线性方程(组):一维非线性方程(一)二分法、不动点迭代、牛顿法 [MATLAB]

    1. 二分法(Bisection) 1) 原理 [介值定理] 对于连续的一元非线性函数,若其在两个点的取值异号,则在两点间必定存在零点. [迭代流程] 若左右两端取值不同,则取其中点,求其函数值,取中 ...