![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
我在做什么
文章平均质量分 83
-Early
解惑寻道
展开
-
浮点数计算精度丢失问题#W01
前几日电话面试,被问到一个问题: “浮点数计算精度丢失的原因是什么?”啊,啥? 我一脸懵逼,“就是在irb中,0.2+0.4不等于0.6,为什么?“,面试官又补了一句。我没有真正get到问题是什么,胡说了一通。显然,这是问到了我的知识盲区了,我从来没有遇到过这个问题。于是我打开python命令行,执行了一下:>>> 0.4 + 0.20.6000000000000001>...原创 2018-03-23 21:15:20 · 4544 阅读 · 2 评论 -
ElasticSearch如何增删改查/CURD数据? #W10
总结一下在ES中,CURD分别是什么情况。假设,有这样的一个集群(图片来源):三个节点,一个索引A, A有两个主分片, 每个主分片有两个副本分片(灰色),A包含一个type B。基于这个集群,我们来从宏观脉络上梳理一下,数据的增删改查。在ES中数据其实是不可被修改的,只能进行替换,或者标记(删除),也就是说,用户进行的CURD其实就只有“读“和”写”这两个操作,下面来分别梳理。如何进行读?ES中数...原创 2018-05-13 11:49:50 · 330 阅读 · 0 评论 -
数据结构之HashMap # W12
平时在工作中,会使用大量的Hash,这种美妙的数据结构,在开发中给予了我们极大的帮助,非常值得深入学习。 我想通过本文,来梳理一下,到目前为止我在HashMap上粗浅的知识积淀。 文章的内容大致会有以下几个部分:哈希的实现原理哈希的冲突解决哈希映射的应用用哈希实现快速存取一个爬虫系统在互联网上按照链接(url)爬取数据,每爬取完一个链接,就将该链接保存在某个地方,标记为...原创 2018-06-03 00:57:24 · 230 阅读 · 0 评论 -
五问Sidekiq # W11
Sidekiq 是Ruby社区最受欢迎的异步任务框架之一,几乎是Rails项目标配。本文,我将从实际使用者的角度来提出疑问,通过一一解答这些问题来剖析Sidekiq是如何工作的。(代码基于Sidekiq-5.1.3)在Web请求中,有很多任务是可以放到后台执行的,比如用户购买商品付款成功后,就可以直接向用户购买成功,相应的短信发送,物流通知等等就可以放到后台任务去做,不用在用户购买的同时立即执行,...原创 2018-05-23 23:59:07 · 766 阅读 · 0 评论 -
Unicorn 进程如何保证平滑更替? #W13
周末花时间通读了Working with Unix Processes 这本书的中文版, 再回头看之前没怎么看懂的unicorn-unix-magic-tricks文章,收获颇丰。本文结合一点源码,来梳理一下Unicorn进程是如何进行平滑更替的。根据Unicorn的信号机制,当需要hot-reload时,可以给Unicorn的Master进程一个USR2信号:$ kill -s USR2...原创 2018-06-12 12:56:03 · 527 阅读 · 0 评论 -
Malloc 会加倍 Ruby 多线程应用的内存消耗 # W14
总结: 内存碎片是一个难以测量和诊断的问题,但是解决这个问题有时也很容易。让我们看看在CRuby程序中,导致内存碎片的一个根源: 每个线程的内存动态分配(malloc’s per-thread memory arenas)不是每次一个简单的配置修改就能彻底解决一个问题。我曾有一个客户端,它的Sidekiq进程使用了非常多的内存,大概每个进程都占用了1G。它们刚开始启动时,大概每个只...翻译 2018-07-01 21:28:38 · 717 阅读 · 0 评论 -
Ruby GC 简史 # W15
首发在这里众所周知,Ruby(MRI)中有三大神秘区域: - GC - GIL - 编译/执行我就是CRuby的GC,虽然大多数人不了解我,或者了解了也没什么卵用。但我还是得向你介绍一下我自己。我在这几年改变了很多。我是谁程序员在构建应用程序的时候,或多或少都需要使用内存,在C/C++中,绝大部分使用的内存都需要自己调用API去申请,用完了之后还要一点不剩地归还。这是一...原创 2018-07-08 22:48:07 · 289 阅读 · 0 评论 -
从 ActiveRecord 看乐观锁 # W16
内容概要:Rails中乐观锁的使用Rails中乐观锁实现原理乐观锁定义乐观锁的实现有悲观锁参与用分层的思维理解乐观锁全文地址: https://ruby-china.org/topics/37161...原创 2018-07-17 21:22:34 · 223 阅读 · 0 评论 -
Rails的includes实现原理及困境 #W17
美妙的开端includes等方法在ActiveRecord中有广泛的使用,是解决N+1问题的神器,使用非常方便:@users = User.where(id: [1,2,3,4,5,6]).includes(:area)这样可以仅通过两条SQL,将用户及其所在地区的数据提取出来,避免了通过User逐条查询对应的地区数据,减少了与数据库的交互次数。在IO密集型的Web领域,这是最基本...原创 2018-08-02 21:55:45 · 701 阅读 · 0 评论 -
深入理解数据库事务 # W18
Transaction作为关系型数据库的核心组成,在数据安全方面有着非常重要的作用,本文会一步步解析事务的核心特性,以获得对事务更深的理解。什么是事务数据库几乎是所有系统的核心模块,它将数据有条理地保存在储存介质(磁盘)中, 并在逻辑上,将数据以结构化的形态呈现给用户。支持数据的增、删、改、查,并在过程中保障数据的正确且可靠。要做到这点并非易事,常见的例子就是银行转账,A...原创 2018-09-12 21:29:30 · 329 阅读 · 0 评论 -
如何熟悉业务? # W09
前面计划了“熟悉业务”的整体安排,现在来从技术上讨论一下,应该如何有条理、有节奏地熟悉业务,并在部分方面深入代码细节,掌握核心实现。同时将这些形成技术文档,供团队查阅。困境是什么?CRM类型的业务在细节上非常复杂,由于没有实现文档,很多时候一头扎进代码,会被高度抽象没有注释的代码搞的一头雾水,由于产品本身的复杂性很高,代码的实现本身就是细节魔鬼。 所以,从数据模型上去梳理出核心脉络不是好的选择。同...原创 2018-05-12 17:59:57 · 1128 阅读 · 0 评论 -
多条件查询报表统计业务#W03
废话入职第二天,接到了一个任务,优化报表业务....业务需求生成各种报表数据。 挑出其中之一来进行讨论,有一张跟进记录表,里面可以记录某人在某个时间以某种方式跟进了某个商业对象。例如,“张三”,2018.4.10,通过电话,落实了某个合同。 其中跟进方式,有电话,登门拜访等等多种方式,并支持自定义跟进方式,跟进对象也分为数种,例如某个商机,线索,合同等等。现在需要实现,对于任意跟进者(可多个),在...原创 2018-04-07 17:03:54 · 260 阅读 · 0 评论 -
ElasticSearch初探 #W04
ES是什么?来自官方文档的解释:基于Luence的开源搜索引擎,有以下特性一个分布式的实时文档存储,每个字段 可以被索引与搜索一个分布式实时分析搜索引擎能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据可以看到ES是一个搜索引擎,能提供高性能的搜索分析功能。和平时使用最多的MySQL这种关系型数据库有着概念级别的区别。解决什么问题存放在关系型数据库中的数据也经常被检索,但是有着...原创 2018-04-09 17:20:37 · 153 阅读 · 0 评论 -
简单慢sql处理思路 #W05
解决问题的秘诀在于思路,这也是需要训练的最重要的能力之一。下面通过复盘一次慢sql解决的过程,争取提炼出某一维度的思路。SELECT DISTINCT `customers`.* FROM customers as customers WHERE ((customers.user_id in (SELECT `users`.`id` FROM `users` WHERE `users`.`stat...原创 2018-04-14 16:56:56 · 446 阅读 · 0 评论 -
面向对象设计之Ruby #W06
这篇文章是我读 《面向对象设计实践指南 Ruby语言描述》的笔记。 面向对象面向对象思想认为世界是多个对象之间的一系列消息传递构成。它将行为封装在对象内部,通过在对象之间进行消息传递来实现系统的运作。(好抽象,期待后面能更加深入理解其本质)单一职责1.为什么要单一职责?单一职责的目的是主要有以下几点:让代码易于重用。当某个方法处理多个职责的时,若其中部分职责有重用需求时,无法简单的重用该方法。职责...原创 2018-04-15 17:56:06 · 182 阅读 · 0 评论 -
聊聊MySQL的group by分组 #W02
最近接触了报表业务,里面有各种分组、求和操作。整理大脑中对分组的知识碎片,并查阅相关资料,在这里对group 做一个知识的梳理。什么是分组?假设有一张表articles, 有 id(主键)、author_id(作者)、type_id(类型)、created_at等字段。select author_id, count(id) from articles group by author_id;上面就是...原创 2018-04-07 00:10:17 · 811 阅读 · 0 评论 -
ElasticSearch中如何分布式存储数据 #W07
本篇文章,我们来总结一下,在宏观上,ES中的数据是如何分布的,为什么能便捷地进行扩容。宏观结构1 集群cluster集群这个概念从业务层面来看,是聚合了某方面功能的节点的组合,一般由单个或多个节点组成。在ES中,具有相同的cluster.name的节点就为同一个集群, 一个集群就是由一个或多个拥有相同cluster.name的节点组成。集群也是ES中最顶层的对象,在同一个集群中,ES会将数据均匀地...原创 2018-04-19 19:19:49 · 3070 阅读 · 0 评论 -
乐观锁与悲观锁 # W08
锁存在的意义在并发环境中,如果有多个线程对某项资源同时进行“写”操作,那么就可能会出现常说的“并发问题”,数据的一致性会被破坏。这时候,需要锁,来防止这种情况发生。锁本质上是限制了多个线程对同一资源在同一时间进行写操作。要实现这个限制,常规的有两种级别: 乐观并发控制和悲观并发控制。悲观锁与乐观锁”悲观“是假设: 我在修改数据的时候,一定会有其他人也来改,这样必会导致数据不一致。为了防止别人在我改...原创 2018-05-01 16:07:47 · 139 阅读 · 0 评论 -
Sneaker工作方式简析 # W19
Sneaker是基于Ruby的高性能RabbitMQ消费者,可以便捷地嵌入Rails应用,以常驻进程的方式处理RabbitMQ消息,运行模式类似Sidekiq。 本文简单介绍下Sneaker背后的工作方式,内容大概包含以下几个方面:Sneaker的工作模型Bunny如何接收、分发消息Sneaker的工作方式Sneaker借助ServerEngine实现进程模型搭建,可以有多进程、多线程...原创 2018-10-17 08:26:24 · 1142 阅读 · 0 评论