- 博客(57)
- 收藏
- 关注
原创 为什么工作不能让人满意?
那么,怎样才算定义完成?弥合差异的方式有很多,有一个最佳实践,它的名字叫 DoD(Definition of Done,完成的定义),从这个概念的名字便不难看出,它就是为了解决软件开发中常见的“完成”问题而生的。小李认为这两天都是编写功能代码的,而老张想的是,小李应该自己写好功能代码和单元测试,可能还包括了功能测试,这中间的差异是测试代码的工作量。人与人协作中,经常会出现各种问题,根本原因就是,有太多因为理解差异造成的误解,进而浪费了大量的时间,而 DoD 就是一种将容易产生歧义的理念落到实处的方法。
2022-09-03 09:30:00
381
原创 如何让你的努力有价值?
回到前面“设计登录功能”的例子,对比“以终为始”的思维,你也许会替我的同事抱不平,他们或许也有“以终为始”的思路,只不过,他们的“终”和我这个客户的“终”不一样罢了。软件行业有很多英雄传说,一个人或者一个团队连续奋战一段时间,写好了一个软件,在上线前夜发现了一个问题,然后冒着“不成功便成仁”的风险,通宵达旦解决了问题,一战成名。程序员其实就是一个想象的共同体,这个“集体想象”就是我们要做的软件,任何想象都需要一个载体将其展现出来,我们编写软件的过程就是将这个“集体想象”落实的过程。
2022-09-02 21:30:00
379
原创 NIO Selector选择器解析
通过select系列方法,选择器会通过JNI,去进行底层操作系统的系统调用(比如select/epoll),可以不断地查询通道中所发生操作的就绪状态(或者IO事件),并且把这些发生了底层IO事件,转换成Java NIO中的IO事件,记录在的通道关联的SelectionKey的readyOps上。在事件处理过程中,对于新建立的socketChannel客户端传输通道,也要注册到同一个选择器上,这样就能使用同一个选择线程,不断地对所有的注册通道进行选择键的查询。并不是所有的通道,都是可以被选择器监控或选择的。
2022-09-02 12:53:14
1245
原创 程序员是如何思考的?
自动化就是将繁琐的工作通过自动化的方式交给机器执行,这是我们程序员本职工作的一部分,我们擅长的是为其他人打造自动化的服务,但自己的工作却应用得不够,这也是我们工作中最值得优化的部分。有了任务分解的视角,我需要将一个大的目标进行拆解,如果我要达成这个目标,整体解决方案是远远不够的,我需要把任务分解成一个一个小的部分。接下来,我会关注实现路径,用户会怎么用,是否有其他的替代手段,我需要了解产品经理的设计是经过思考的,还是“拍着脑袋”给出的。所以,我要不断地问问题,确保自己的理解和产品经理交代的内容一致。
2022-09-02 09:57:43
431
原创 程序问题不是程序员要解决的问题
也许看到这四个原则的名字,你会不以为然,这些说法你在很多地方都看到过,比如:你以为的“终”可能不是终,因为你只是站在自己的角度;比如你要做一个APP,APP的内容是你无论如何都要写的,这就是“本质复杂度”。我们很辛苦,但耗费我们大量时间和精力去应付的工作,并不是技术工作,反而是这些看似很“不值当”的事儿。所以,想要将精力聚焦在本质复杂度上,提高工作效率,摆脱直觉的束缚,只要掌握上面的四个原则就可以了。因此,只要选择了正确的做事方法,减少偶然复杂度带来的工作量,软件开发是可以有条不紊进行的。...
2022-09-01 09:44:20
188
原创 Elasticsearch之拼音搜索(十五)
拼音搜索在中文搜索环境中是经常使用的一种功能,用户只需要输入关键词的拼音全拼或者拼音首字母,搜索引擎就可以搜索出相关结果。在国内,中文输入法基本上都是基于汉语拼音的,这种在符合用户输入习惯的条件下缩短用户输入时间的功能是非常受欢迎的。在ES中可以使用拼音分析器插件进行拼音搜索,插件的项目地址为https://github.com/medcl/elasticsearch-analysis-pinyin,该插件对较新的ES版本并不支持,需要用户自行进行编译安装。...
2022-08-30 21:00:00
1155
原创 ElasticSearch分析器解析(十四)
当系统内置的分析器不满足需求时,用户可以使用自定义分析器。在有些场景中,某个文本字段不是自然语言而是在某种规则下的编码。例如,在旅馆索引中有个sup_env字段,其值为“APP,H5,WX”,表示当前旅馆可以在App、Web端和微信小程序端上显示。假设当前搜索用户使用的是H5或App客户端,则需要过滤掉不支持在这两个客户端上显示的旅馆。首先,需要在索引创建的DSL中定义分析器comma_analyzer,该分析器中只有一个分词组件,该分词组件使用逗号进行词语切分;
2022-08-23 21:30:00
1352
原创 Elasticsearch之文本搜索(十三)
ES作为一款搜索引擎框架,文本搜索是其核心功能。ES在文本索引的建立和搜索过程中依赖两大组件,即Lucene和分析器。其中,Lucene负责进行倒排索引的物理构建,分析器负责在建立倒排索引前和搜索前对文本进行分词和语法处理。
2022-08-19 21:30:00
1332
原创 Elasticsearch之排序解析(十二)
在默认情况下,ES对搜索结果是按照相关性降序排序的。有时需要按照某些字段的值进行升序或者降序排序。ES提供了sort子句可以对数据进行排序。使用sort子句一般是按照字段信息进行排序,不受相关性影响,而且打分步骤需要耗费一定的硬件资源和时间,因此默认情况下,不对文档进行打分。使用sort排序分为两种类别,一种是按照字段值的大小进行排序,另一种是按照给定地理坐标的距离远近进行排序。...
2022-08-10 21:30:00
4571
1
原创 Elasticsearch搜索匹配功能解析(十一)
针对不同的数据类型,ES提供了很多搜索匹配功能:在关系型数据库中,当需要查询所有文档的数据时,对应的SQL语句为select * form table_name。在ES中使用ES的match_all查询可以完成类似的功能。使用match_all查询文档时,ES不对文档进行打分计算,默认情况下给每个文档赋予1.0的得分。用户可以通过boost参数设定该分值。以下示例使用match_all查询所有文档,并设定所有文档的分值为2.0:结果返回:通过返回数据集可以看到,ES返回了所有的文档,并且所有文档
2022-08-09 21:00:00
3339
原创 Elasticsearch搜索辅助功能解析(十)
ES提供的各种搜索辅助功能。例如,为优化搜索性能,需要指定搜索结果返回一部分字段内容。为了更好地呈现结果,需要用到结果计数和分页功能;当遇到性能瓶颈时,需要剖析搜索各个环节的耗时;面对不符合预期的搜索结果时,需要分析各个文档的评分细节。...
2022-08-06 09:30:00
2670
原创 Elasticsearch之文档操作(九)
在Java高级REST客户端中,执行根据条件更新文档,需要创建UpdateByQueryRequest对象并设置对应的索引名称,类似于DSL中的query子句,通过调用UpdateByQuery Request.setQuery()方法设置查询逻辑,script子句通过调用UpdateByQueryRequest.setScript()方法设置更新逻辑,然后执行客户端的updateByQuery()方法并把UpdateByQueryRequest对象传入即可。下面的代码演示了向索引中添加单条文档的方法。..
2022-08-05 09:30:00
1676
原创 Elasticsearch映射操作(八)
在使用数据之前,需要构建数据的组织结构。这种组织结构在关系型数据库中叫作表结构,在ES中叫作映射。作为无模式搜索引擎,ES可以在数据写入时猜测数据类型,从而自动创建映射。但有时ES创建的映射中的数据类型和目标类型可能不一致。当需要严格控制数据类型时,还是需要用户手动创建映射。...
2022-08-04 09:30:00
4799
1
原创 Spring Data Elasticsearch介绍(七)
SpringDataElasticsearch是SpringBoot套件中的一个组件,在SpringBoot中连接ES可以使用SpringDataElasticsearch。SpringDataElasticsearch是SpringData项目的一部分,该项目致力于提供一致的基于Spring的数据查询和存储编程模型。SpringDataElasticsearch封装了创建客户端的逻辑并与服务端保持长连接,让我们不必关注于网络连接问题。...
2022-08-03 09:30:00
1359
原创 Elasticsearch索引操作(七)
索引的相关操作,涉及创建、删除、关闭和打开索引,以及索引别名的操作。其中,索引别名的操作在生产环境中使用比较广泛,可以和关闭或删除索引配合使用。在生产环境中使用索引时,一定要慎重操作,因为稍有不慎就会导致数据的丢失或异常。......
2022-08-03 09:30:00
1718
原创 Elasticsearch之java客户端(六)
Java客户端分为低级客户端和高级客户端两种。低级客户端兼容所有版本的ES,但其需要提供JSON字符串,因此这种开发方式比较低效。高级客户端是基于低级客户端开发出来的,屏蔽了底层技术,使用户可以更专注于搜索业务,这是官方推荐的开发方式。...
2022-08-02 09:30:00
1786
原创 Kibana介绍(五)
Kibana是ELK家族中一个开源、免费的可视化数据搜索和分析平台。借助Kibana,用户不需要编码就可以将ES中分析的结果进行可视化呈现,如以常用的饼图、柱状图和时序图等方式呈现。除了可视化数据分析功能,Kibana还提供了DevTools,它是一款可以与ES进行交互式请求的工具,可以借助它进行DSL调试。...
2022-08-01 22:00:00
1137
原创 ElasticSearch实操入门(四)
返回的信息中主要描述了当前集群中各个节点的IP地址及CPU的内存负载情况,另外还包括节点角色信息,其中,es1目前是集群中的master节点。在这种情况下,不同的集群节点需要将cluster_name的值定义为不同的名称。集群模式可以增强ES集群的服务性能或提升其高可用性,假设这3台计算机的IP地址分别为192.168.0.1、192.168.0.2和192.168.0.3,名称分别为es1、es2和es3,需要在这3台计算机上创建除root外的用户进行集群的搭建。query子句可以按照需求填充查询项。..
2022-07-30 09:30:00
513
原创 Elasticsearch应用场景(三)
可以把推荐模型算法计算的商品和用户向量存储到ES索引中,当实时请求时,加载用户向量并使用ES的ScriptScore进行查询,使每个文档最终的排序分值等于当前用户向量与当前文档向量的相似度。查询时客户端可以把查询请求分发到ES中,ES从索引中查询并返回符合条件的记录主键,客户端再根据返回的记录主键请求RDBMS得到实时数据。在有些场景中,部分数据是强事务性的,或者说这些数据需要关联多张表才可以获取到,这种数据不适合在ES中作为最终数据进行呈现,最好将它们存储在RDBMS中。...
2022-07-29 09:30:00
2958
原创 Elasticsearch架构原理(二)
假设将数据映射到分片1上,因为分片1的主分片在节点2上,因此节点1把请求转发到节点2上。节点2接收客户端的数据并进行存储,然后把请求转发到副分片1所在的节点1和节点3上,当所有副分片所在的节点全部完成存储后,协调节点也就是节点1向客户端返回成功标志。当ES协调节点接收到来自客户端的获取某个索引的某文档的请求时,协调节点会找到该文档所在的所有分片,然后根据轮询算法在主/副分片中选择一个分片并将请求转发给该分片所在的节点,该节点会将目标数据发送给协调节点,协调节点再将数据返回给客户端。.........
2022-07-28 07:50:11
3663
1
原创 ElasticSearch入门(一)
很多应用都有搜索功能。Lucene作为“老牌”的搜索技术支持库,它提供的很多功能都能用于处理文本类型的数据。但是使用Lucene架设搜索引擎需要使用者熟悉搜索引擎的很多知识,对使用者的要求非常高,并且Lucene仅仅提供了基础的搜索引擎支持,而对搜索的分布式、容错性和实时性并不支持。elasticSearch不仅是一个搜索引擎框架,而且其官方还提供了ELK“全家桶”,为构建搜索引擎提供了很好的解决方案。其中,E代表Elasticsearch,主要提供数据搜索和分析功能;...
2022-07-27 22:00:00
534
原创 浅析NIO Channel
JavaNIO中,一个socket连接使用一个Channel(通道)来表示。然而,从更广泛的层面来说,一个通道封装了一个底层的文件描述符,例如硬件设备、文件、网络连接等。所以,与文件描述符相对应,JavaNIO的通道分为很多类型。但是Java的通道更加的细化,例如,对应到不同的网络传输协议类型,在Java中都有不同的NIOChannel(通道)相对应。......
2022-07-26 20:39:34
800
原创 NIO组件之Buffer详解
Buffer类的capacity属性,表示内部容量的大小。一旦写入的对象数量超过了capacity容量,缓冲区就满了,不能再写入了。Buffer类的capacity属性一旦初始化,就不能再改变。原因是什么呢?Buffer类的对象在初始化时,会按照capacity分配内部数组的内存,在数组内存分配好之后,它的大小当然就不能改变了。Buffer类是一个抽象类,Java不能直接用来新建对象。属性说明capacity容量,即可以容纳的最大数据量;在缓冲区创建时设置并且不能改变limit。...
2022-07-25 13:20:01
1270
1
原创 NIO简介
在1.4版本之前,JavaIO类库是阻塞式IO;从1.4版本开始,引进了新的异步IO库,被称为JavaNewIO类库,简称为JavaNIO。JavaNIO类库的目标,就是要让Java支持非阻塞IO,基于这个原因,更多的人喜欢称JavaNIO为非阻塞IO(Non-BlockIO),称“老的”阻塞式JavaIO为OIO(OldIO)。总体上说,NIO弥补了原来面向流的OIO同步阻塞的不足,它为标准Java代码提供了高速的、面向缓冲区的IO。Channel(通道)Buffer(缓冲区)...
2022-07-20 21:30:00
1462
原创 常见的IO模型
同步和异步,是针对应用程序(如Java)与内核的交互过程的方向而言的。同步类型的IO操作,发起方是应用程序,接收方是内核。同步IO由应用进程发起IO操作,并阻塞等待,或者轮询的IO操作是否完成。异步IO操作,应用程序在提前注册完成回调函数之后去做自己的事情,IO交给内核来处理,在内核完成IO操作以后,启动进程的回调函数阻塞与非阻塞,关注的是用户进程在IO过程中的等待状态。前者用户进程需要为IO操作去阻塞等待,而后者用户进程可以不用为IO操作去阻塞等待。...
2022-07-19 09:30:00
493
原创 IO读写原理
为了避免用户进程直接操作内核,保证内核安全,操作系统将内存(虚拟内存)划分操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内核空间,也有访问底层硬件设备的权限。内核空间总是驻留在内存中,它是为操作系统的内核保留的。应用程序是不允许直接在内核空间区域进行读写,也是不容许直接调用内核代码定义的函数的。每个应用程序进程都有一个单独的用户空间,对应的进程处于用户态,用户态进程不能访问内核空间中的数据,也不能直接调用内核函数的,因此要进行系统调用的时候,......
2022-07-18 13:36:58
1062
原创 MySQL索引匹配解析
数据库索引包括了覆盖索引、前缀索引、索引下推。在满足语句需求的情况下, 尽量少地访问资源是数据库设计的重要原则之一。我们在使用数据库的时候,尤其是在设计表结构时,也要以减少资源消耗作为目标。...
2022-07-15 23:22:37
750
原创 Canal实战
当遇到异地数据异构的时候,对于Mysql来说,Canal是基于数据库的日志解析,获取增量变更进行同步,提供增量数据订阅&消费的中间件。Canal主要支持了MySQL的Binlog解析,解析完成后才利用CanalClient来处理获得的相关数据。...
2022-07-14 20:50:28
565
原创 MySQL索引深入解析
索引的出现其实就是为了提高数据查询的效率。哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的键即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。当然多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。......
2022-07-13 09:30:00
156
原创 MongoDB应用场景
传统的关系型数据库(如MySQL),在数据操作的“三高”需求以及应对Web2.0的网站需求面前,显得力不从心。其中“三高”是指:
2022-07-12 09:30:00
3125
原创 Mysql事务
事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。所以,MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。A(Atomicity):原子性原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。C(Consistency):一致性事务必须使数据库从一个一致性状态变换到另外一个一致性状态。I(Is
2022-07-11 20:03:01
375
原创 Mysql重要日志
Mysql包含两个重要日志模块:redo log(重做日志)和 binlog(归档日志)mysql更新语句的流程,与查询流程大体一致,与查询流程不一样的是,更新流程还涉及两个重要的日志模块:redo log 与binlog。redo log也称为WAL(Write-ahead logging,预写式日志),WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志【写日志是顺序写盘,速度很快】,再写磁盘。具体来说,当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 red
2022-07-11 07:28:29
126
原创 Java8之Lambda表达式
在介绍如何使用 Lambda 表达式之前,我们先来看看匿名内部类,例如,我们使用匿名内部类比较两个 Integer 类型数据的大小在上述代码中,我们使用匿名内部类实现了比较两个 Integer 类型数据的大小。接下来,我们就可以将上述匿名内部类的实例作为参数,传递到其他方法中了,如下所示。TreeSet treeSet = new TreeSet(com);完整的代码如下所示:我们分析下上述代码,在整个匿名内部类中,实际上真正有用的就是下面一行代码。Lambda..
2022-07-08 09:30:00
311
原创 Java8之函数式接口
Consumer 接口是消费性接口,无返回值。Java8 中对 Consumer 的定义如下所示。使用示例Supplier接口Supplier 接口是供给型接口,有返回值,Java8 中对 Supplier 接口的定义如下所示。使用示例Function接口Function 接口是函数型接口,有返回值,Java8 中对 Function 接口的定义如下所示。使用示例Predicate接口Predicate 接口是断言型接口,返回值类型为 boolean,Java8 中
2022-07-08 09:30:00
526
原创 MySQL基础架构及语句执行流程
以下为MySQL 的基本架构示意图,从中你可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory
2022-07-07 09:30:00
112
原创 浅析CPU上下文切换
cpu寄存器是 CPU 内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果以及一些 CPU 运行需要的信息。其总共包含以下几种:程序计数器是用于存放下一条指令所在单元的地址的地方。当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。此后经过分析指令,执行指令。完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。...
2022-07-04 20:43:47
234
原创 高性能数据库集群方案
虽然近十年来各种存储技术飞速发展,但关系数据库由于其 ACID 的特性和功能强大的 SQL 查询,目前还是各种业务系统中关键和核心的存储系统,很多场景下高性能的设计最核心的部分就是关系数据库的设计。虽然关系数据库厂商(Oracle、DB2、MySQL 等)在优化和提升单个数据库服务器的性能方面也做了非常多的技术优化和改进。但业务发展速度和数据增长速度,远远超出数据库厂商的优化速度,尤其是互联网业务兴起之后,海量用户加上海量数据的特点,单个数据库服务器已经难以满足业务需要,必须考虑数据库集群的方式来提升性能。
2022-07-03 09:30:00
629
原创 平均负载深入解析
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。所谓可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程。不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的...
2022-07-02 09:30:00
489
原创 MongoDB模式设计注意事项
模式设计,即在文档中表示数据的方式,对于数据表示来说是非常关键的。最好的方式是按照应用程序希望看到的形式来表示数据。因此,与关系数据库不同,在为模式进行建模之前,首先需要了解查询和数据访问的方式。以下是在设计模式时需要考虑的几个关键方面。有一些数据库或硬件的限制是你需要了解的。你还需要考虑 MongoDB 的一些特殊之处,比如最大文档大小为 16MB、从磁盘读写完整文档、更新会重写整个文档,以及在文档级别进行原子更新。你需要确定并量化应用程序和更大系统的工作负载。...
2022-07-01 09:30:00
443
原创 MongoDB之事务
事务是数据库中处理的逻辑单元,包括一个或多个数据库操作,既可以是读操作,也可以是写操作。在某些情况下,作为这个逻辑处理单元的一部分,应用程序可能需要对多个文档(在一个或多个集合中)进行读写。事务的一个重要方面是它永远不会只完成一部分——它要么成功,要么失败。要使用事务,你所部署的 MongoDB 必须是 MongoDB 4.2 或更高版本,MongoDB 的驱动程序必须更新为 MongoDB 4.2 或更高版本。...
2022-06-30 09:00:00
8601
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人