• 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. ArrayQueue(队列)

        code1: #include <stdio.h> #include <conio.h> #include <stdlib.h> #define MAXSIZE 6 ...

      2. FastStone Capture 截图工具

        主要功能介绍 截屏 包括了全屏截取,当前活动窗口截取,截取选定区域,多边形截取和截取滚动页面等,基本上常用的都有了.特别是滚动截取,许多朋友为了这个功能,不惜安装各种重量级的截屏软件,甚至四处下载各种 ...

      3. php 算法知识 猴子选大王

        一群猴子排成一圈,按1,2,...,n依次编号. 然后从第1只开始数,数到第m只,把它踢出圈, 从它后面再开始数,再数到第m只,在把它踢出去..., 如此不停的进行下去,直到最后只剩下一只猴子为止,那 ...

      4. linux 添加与修改用户归属组

        参考资源:https://cnzhx.net/blog/linux-add-user-to-group/ 一:已存在的用户 1.要以root进行登录 2.打开终端 3.修改分组 usermod -a ...

      5. 创建SSH keys用于添加到Git服务器上

        SSH keys SSH key 可以让你在你的电脑和Git服务器之间建立安全的加密连接.先执行以下语句来判断是否已经存在本地公钥: cat ~/.ssh/id_rsa.pub 如果你看到一长串以 s ...

      6. Java源码-集合-ArrayList

        基于JDK1.8.0_191 介绍   在Java中,对于数据的保存和使用有多种方式,主要的目的是以更少的资源消耗解决更多的问题,数组就是其中的一种,它的特点是所有的数据都保存在内存的一段连续空间中, ...

      7. Linux命令:vmstat命令

        vmstat:虚拟内存状态查看命令 命令选项 vmstat 1         #每秒钟刷新1次 vmstat 1 3      #每秒刷新1次,只刷3次 vmstat -s        #显示内存 ...

      8. Codeforces1307C. Cow and Message

        读题,我们知道选1个.选2个的时候是没有冲突的,大于2个的时候就有限制,那么我们观察是否可以把大于2个的情况都转换一下,可以发现,如果有一个串的长度大于2,且出现的次数大于2,那么,组成这个串里必定有 ...

      9. ubuntu 解压命令全览

        .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)-------------------------- ...

      10. Flask - 请求扩展,钩子函数(Django的中间件) --> 请求前,中,后,

        例子1. 处理请求之前 @app.before_request 在请求之前,这个被装饰的函数会被执行 用户登录验证代码可以在这里写 @app.before_request def process_re ...