• Rails
    • 大数据情况下

    • 结论:当数据量大到一定程序,请尽量使用原生sql

      Mixin

      • Mixin include: 作为实例方法引入
      • extend : 作为类方法引入
      • Inheritance(继承)

      override

      ruby class內的method都是可以被修改、添加定义的。
      修改影响所有实例,包括修改操作前创建的实例。

      异常处理

      begin
      # 可能會發生例外的 code
      rescue AExceptionClass => some_variable
      # 屬於 AExceptionClass 的例外發生時 run 這段 code
      rescue BExceptionClass => some_other_variable
      # 屬於 BExceptionClass 的例外發生時 run 這段 code
      else
      # 都沒有例外發生時 run 這段 code
      ensure
      # 無論有沒有發生例外,都會 run 這段 code
      end
      def foo
      # 正常時的處理
      rescue
      # 發生例外時的處理
      end

      super 与super()

      • super:呼叫父类别的同名函式,并且将本函式的所有参数传入父类别的同名函式。
      • super(): 带括号则表示呼叫父类别的同名函式,但是不传入任何参数

      使用%()处理需要string interpolation但同时也需要" "(double quote)的状况

      <%= "<div class=\"name\"> #{name} </div>" %>
      <%= "<div class='name'> #{name} </div>" %>
      <%= %(<div class="name">#{name}</div>) %>

      当要宣告一个拥有多字串的Array 阵列时,偏好使用%w

      array = ["A", "B", "C", "D"]
      
      array = %w(A B C D)

      Rails

      大数据情况下

      1. 尽量避免使用ActiveRecord Object

      ActiveRecor,rake task在大数据量下运行是非常慢的,应该直接使用sql语句进行数据操作

      2. 有 update_all 可以用,少用 for / each

      posts = Post.where(:board_id => 5)
      post.each do |post|
      post.board_id = 1
      post.save
      end
      当数据量达到十万条时,一天也跑不完 Rails 提供了 update_all 可以用,相当于直接使用sql的效果
      Post.update_all({:board_id => 1}, {:board_id => 5})

      3.不要直接使用Post.all.each,可以用 find_in_batches

      如果十万笔数据加载到内存,估计超过10G,程序可能直接闪退

      Post.find_in_batches(:conditions => "board_id = 5", :batch_size => 1000) do |posts|
      posts.each do |post|
      post.board_id = 1
      post.save
      end
      end

      4. 批量修改数据记录时,使用transaction 跳过每次的 BEGIN COMMIT 过程

      Post.find_in_batches(:conditions => "board_id = 5", :batch_size => 1000) do |posts|
      Post.transaction do
      posts.each do |post|
      post.board_id = 1
      post.save
      end
      end
      end

      5.使用 update_column / sneacky-save 而非原生 save

      save 存储资料时,会调用一堆 validator 和 callbacks
      update_column / sneacky-save会跳过,直接修改数据库字段,区别是update_column一次只能修改一个字段,后者可修改多个字段。

      6.可以的话使用 Post.select("column 1, colum2").where("id < 10"), 代替Post.where("id < 10")

      7. 使用 delegate 把大字段搬出去,独立成表

      class Post < ActiveRecord::Base
      has_one :meta after_create :create_meta deleagte :content, :to => :meta
      end

      8. 添加索引INDEX,避免索引过长

      避免直接对varchar(255) 加索引
      ALTER TABLE post DROP INDEX PTitle, ADD INDEX(PTitle(13));

      9. delete / destroy的时间成本

      • destroy 刪除资料并callbacks
      • delete 刪除资料,不callbacks
      • destroy_all 和 delete_all 也类似

      Mysql提供TRUNCATE TABLE清空表
      delete_all不触发callback,但是会update index,所以相比TRUNCATE TABLE会很慢

      TRUNCATE TABLE
      ActiveRecord::Base.connection.execute("TRUNCATE TABLE #{table_name}")

      10. 无法避免的耗时操作丟到 background job 去操作。

      • delayed_job (不推荐)
      • resque
      • sidekiq

      结论:当数据量大到一定程序,请尽量使用原生sql

      201705 Ruby基础拾遗的更多相关文章

      1. 基础拾遗------redis详解

        基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

      2. 基础拾遗------webservice详解

        基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

      3. 基础拾遗-----mongoDB操作

        基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

      4. 基础拾遗----RabbitMQ(含封装类库源码)

        基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

      5. Ruby基础教程

        一.Ruby基础知识 1.关于Ruby Ruby是脚本语言 Ruby是面向对象语言 Ruby是跨平台语言 Ruby是开放源码软件 2.Ruby入门书籍推荐 <Ruby.Programming向R ...

      6. 1月10日 ruby基础教程,查漏补缺; 2月22日 Exception补充

        https://ruby-doc.org/core-2.5.0/Exception.html 1月20日练习完1,2章. 第一章 初探 ‘’单引号不执行转义符. \t 制表符.\n 换行符. p me ...

      7. 基础拾遗----RabbitMQ

        基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

      8. Java基础拾遗(二)

        (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358523冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...

      9. Java基础拾遗(一)

        (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358391冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...

      随机推荐

      1. 蓝桥杯 K好数

        如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22.30.3 ...

      2. springboot例子

        @Mapperpublic interface FinancingMapper { @Insert("<script>" + "insert into fin ...

      3. pexpect &&pxssh

        python 3.6 pip  install pexpect #!/usr/bin/python3 import os import sys curPath = os.path.abspath(os ...

      4. MySQL - 设置UTF-8编码

        1. 在Windows上,安装时请选择UTF-8编码,以便正确地处理中文. 在Mac或Linux上,需要编辑MySQL的配置文件,把数据库默认的编码全部改为UTF-8.MySQL的配置文件默认存放在/ ...

      5. 笔记-Python-性能优化

        笔记-Python-性能优化 1.      开始 1.1.    python性能差么? 做一个判断前,先问是不是. python运行效率低是事实. 1.2.    为什么? 原因: Python是 ...

      6. Python数据类型-5 元组

        元组 我们知道,用方括号括起来的是列表,那么用圆括号括起来的是什么,是元组. 元组也是序列结构,但是是一种不可变序列,你可以简单的理解为内容不可变的列表.除了在内部元素不可修改的区别外,元组和列表的用 ...

      7. swoole 父子进程间通信

        <?php /** * 场景: * 监控订单表状态 父子进程通信 * 一个主进程 两个子进程实现 */ //设置主进程名 echo '主进程id:' . posix_getpid() . PHP ...

      8. 【PAT甲级】1017 Queueing at Bank (25 分)

        题意: 输入两个正整数N,K(N<=10000,k<=100)分别表示用户的数量以及银行柜台的数量,接下来N行输入一个字符串(格式为HH:MM:SS)和一个正整数,分别表示一位用户到达银行 ...

      9. H.264 中的Annex B格式和AVCC格式

        首先要理解的是没有标准的H.264基本流格式.文档中的确包含了一个Annex,特别是描述了一种可能的格式Annex B格式,但是这个并不是一个必须要求的格式.标准文档中指定了视频怎样编码成独立的包,但 ...

      10. 在ubuntu中,通过代理服务器访问网络

        一.临时设置代理服务的方式 export http_proxy=http://yourproxyaddress:proxyport 这种方式在你退出当前的shell之前,会影响到所有网络命令,包括wg ...