暂无个人介绍
理论篇 在 Linux 2.4 版以后版本的内核中,几乎全部的中断过程与用户态进程的通信都是使用 netlink 套接字实现的,例如iprote2网络管理工具,它与内核的交互就全部使用了netlink,著名的内核包过滤框架Netfilter在与用户空间的通读,也在最新版本中改变为netlink,无疑,它将是Linux用户态与内核态交流的主要方法之一。它的通信依据是一个对应于进程的标识,一般定为该进程的 ID。当通信的一端处于中断过程时,该标识为 0。当使用 netlink 套接字进行通信,通信的双方都是用户态进程,则使用方法类似于消息队列。但通信双方有一端是中断过程,使用方法则
一、前言 前些日子,开发中用到了netlink来实现内核与用户空间共享内存,写点笔记与大家分享。因为我对这块也不了解,写出来的东西一定存在很多错误,请大家批评指正~ 内核与用户空间共享内存的关键是,用户空间必须得知共享内存的起始地址,这就要求内核空间应该有一种通信机制来通知用户空间。已经有Godbach版主等人用proc文件系统实现了(可以google '共享内存 内核 用户空间'),很显然任何内核空间与用户空间的通信方法都可资利用。本文主要讲基于NETLINK机制的实现。 二、NETLINK简介 netlink在linux的内核与用户空间通信中用得很多(但具体例子我举不出,因为我不清楚~~
从2.6.10开始,Linux内核提供了一个通用的环形缓存(我喜欢称为环形队列);它的头文件是<linux/kfifo.h>,kfifo.c是实现代码。 在设备驱动中环形缓存出现相当多. 网络适配器, 特别地, 常常使用环形缓存来与处理器交换数据(报文)[LDD3]。 见下面的图“LDD3中描述的队列”。 我们来看下kfifo的数据结构: struct kfifo { unsigned char *buffer; /* the buffer holding the data */ unsigned int size; /* the size of the al
在neo4j中,Neo4j Graph Algorithms ,通过call algo.list() 可查看neo4j中的算法列表。 在neo4j官方文档中,主要记录如下各种方法: 一. 中心性算法(Centrality algorithms) 中心度算法主要用来判断一个图中不同节点的重要性: PageRank(页面排名算法,algo.pageRank),pagerank值越高的实体在网络中起到的作用越大; ArticleRank(文档排名算法,algo.articleRank),pagerank的一种变体,平衡了出度高低对重要性的影响;
在之前的文章中,介绍了如何搭建neo4j集群,集群的故障切换和节点恢复,还介绍了如何配置驱动实现自动failover。本文聚焦在neo4j的数据上。聊聊如何从外部数据源将数据导入neo4j,如何对neo4j数据库进行备份和恢复。 数据导入 可以有多种方式将数据导入neo4j。大致分为cypher语句导入、apoc.load函数过程导入和离线import导入。 cypher语句导入 这个最简单,就是直接使用cypher语句的create或merge命令来创建neo4j的节点、边和属性。对比来说,create性能较好,但其不会进行存在与否的检查,可能会导致数据库中出现2个相同的节点等情况,造成
Fork的系统调用代码在linux/arch/i386/kernel/process.c中: asmlinkage int sys_fork(struct pt_regs regs) { return do_fork(SIGCHLD, regs.esp, ®s, 0, NULL, NULL); } Sys_fork系统调用通过 do_fork()函数实现,通过对do_fork()函数传递不同的clone_flags来实现fork,clone,vfork。 Syn_clone和syn_vfork的系统调用代码如下: asmlinkage int sys_clone(struct pt_regs
自陷就是TRAP,LINUX的EXCEPTION-异常,有进程上下文。 TRAP,相当于一个软中断(INT 1, INT 3, 断点,单步等),和软中断调用的系统调用(INT 21, INT 80)几乎一样,属于当前进程,进入内核使用进程的内核栈。唯一不同的是,系统调用的软中断在用户程序中的位置相对固定,而TRAP相对不固定。 假定INT 0是被0除TRAP,你在USER中执行A = 1/0和执行INT 0是一样的,而INT 0 和INT 80也是一样的。用户程序执行INT 80有进程CONTEXT, 执行INT 0也一样有进程CONTEXT. 可以看出,TRAP(比如INT 0)的PR
前面一篇介绍了Neo4j一些比较基础的用法。这一篇笔记主要记录下在导入一个大数据集Aminer中MAG论文数据所遇到的一些问题。 数据集介绍 首先关于论文数据集的描述可以在Aminer_Open_Academic中查看,这里简单介绍一下。 有两套数据,一个是Aminer Papers, 是清华大学整理发布的论文集,MAG Papers是微软学术发布的论文数据集。 我们这里选取了MAG的部分数据集来测试导入到Neo4j中。 MAG数据集一共有9个压缩包,其中每一个压缩包里面有20个txt文件,每个txt文件中每行代表一篇论文,用json表示,mid为论文唯一id,可以作为主键使用。除了论文的基
平时网络部分的东西碰的多些,这块一开始还真不知道怎么写,因为肯定和在用户空间下是不同的。google过后,得到以下答案。一般可以用两种方法:第一种是用系统调用。第二种方法是filp->open()等函数。下面分别来说下这两种方法。 1 利用系统调用: sys_open,sys_write,sys_read等。 其实分析过sys_open可以知道,最后调用的也是filp->open。 sys_open ==> do_sys_open ==> filp->open 在linuxsir上的一个帖子,上面一个版主说:sys_open和进程紧密相关,往往不在内核中使用。 而其实sys_open最后也
近年来,微服务与DevOps等概念不断热炒。两者实际上是紧密相联,又相辅相成,Docker、Mesos、Kubernates等技术方案的快速崛起,为微服务提供了更坚实土壤,使其得以更顺利地实施落地。 类似spirng-boot等技术的发展与大为传播,更是直接促进了微服务成熟化发展。本文将从与对传统单体架构服务与微服务的比较,介绍微服务,并在最后对DevOps与微服务联系做简单介绍。 单体架构(Monolithic Architecture ) 假设你要开发一个Web后台服务,大部份开发者一开始肯定向于将,所有功能实现放在一个服务进程内。例如JavaWeb的开发者,往往会产出一个War包,这就
好奇心 我是在2012年左右开始接触Go,那会主要是基于C/C++做大型的嵌入式系统。最初并不觉得Go有什么优势。一方面来看,性能比不上C/C++,相差数倍,且无法控制内存生命周期,只能依赖Go本身的GC机制。另一方面来看,我们基于C/C++已有一套程序的流程体系,用Go的开发效率并没有显著提升,且编译后的二进制程序往往过大,这对大多嵌入式系统而言是难以接受的。 那时候关注Go主要是出于好奇心,为什么Rob Pike和Ken Thompson等大拿要设计这么一门语言,是因为C不够好?具体是哪里不好?Go本身又有什么优势,在设计最初究竟做了怎样的取舍? 权衡 同年,开始推行敏捷开发,尝试适应
如果我告诉你有这样一种软件架构,一个应用程序的组件通过基于网络的通讯协议为其它组件提供服务,我估计你可能会说它是 … 是的,它和你编程的年限有关。如果你从上世纪九十年代就开始了你的编程生涯,那么你肯定会说它是 面向服务的架构( Service-Oriented Architecture)(SOA)。但是,如果你是个年青人,并且在云上获得初步的经验,那么,你将会说:“哦,你说的是 微服务(Microservices)。” 你们都没错。如果想真正地了解它们的差别,你需要深入地研究这两种架构。
微服务架构,或说是微服务本身,是一种用于提升软件系统可扩展性的架构风格。与微服务相关的好文章不胜枚举,而本文希望能够为那些从未尝试过、或只是刚刚开始尝试微服务的人,提供一份顶级开源工具的清单。 微服务架构可用于企业、政府、学校和慈善机构等的企业级应用程序。与传统风格的单体架构完全相反,微服务专注于单个单元应用程序。 微服务微小、独立且独特。微服务架构的构建和维护都可能非常复杂。微服务之间可以相互通信,利用同步协议、HTTP / REST或异步协议来服务于整体的业务目标。HTTP / REST或AMQP就是协作服务的示例,这些协作服务通过实现彼此相关的功能来尽可能高效地协同工作。
说实在的,人工智能这个概念有些过于高大上,从大的方面包括深度学习、机器学习、强化学习等等,而深度学习又包括图像识别、语音识别、自然语言处理、预测分析;机器学习则包括监督学习、无监督学习、半监督学习,监督学习又细分为回归、分类、决策树等等。理论上人工智能什么都能做,什么都能迎合的上。 关键数据质量管理实在太接地气了,以至于大家都理解为数据质量检查规则定义、数据质量检查规则脚本、检查规则执行引擎、数据质量检查规则执行情况监控,数据质量检查报告;而数据质量校验规则无非就是一致性、准确性、唯一性、真实性、及时性、关联性、完整性的一堆校验,再大白话一些无非就是SQL语句。 而本人面临的还不是基于数据仓库
本篇文章写于2019年底,现在一年半时间过去了,MongoDB的发展显然越来越好。不仅MongoDB公司上市了,且股价彪了不少。另外,新出的版本增加了很多好用的特性,尤其是在最新的MongoDB 4.0版本已支持Replica Set级别的事务,对于Secondary上的读也做了较大的优化。下面是原文: MongoDB是一个非常有前途的数据库,MongoDB官方对自己的定位是通用数据库,其实这个定位跟MySQL有些像。虽其流行度还远未达到MySQL的水平,但笔者有个可能不恰当的比较,MongoDB就像N年前的MySQL,随着时间的推移,会变得越来越强大,也会越来越流行。下面结合MongoDB
MongoDB性能优化,有很多优化的方案,因自己曾参与过一段IoM 1.3的性能优化工作,这里只总结了一下我们实践过的性能要点,作为回顾。 一. MongoDB服务端性能优化点 1. 限制连接数 Mongod 的服务模型是每个网络连接由一个单独的线程来处理,每个线程配置了1MB 的栈空间,当网络连接数太多时,过多的线程会导致上下文切换开销变大,同时内存开销也会上涨。另外,每个连接都要打开一个文件句柄,当然从成本上讲,这个消耗相对内存是小了很多。但换个角度,文件句柄也被其他模块消耗着,比如WT存储引擎,就需要消耗大量的文件句柄。 分布式shard集群部署环境的最大连接数通过route进程的
MongoDB和Redis都是NoSQL数据库,采用结构型数据存储,而MySQL、oracle等则属于传统的关系型数据库。 NoSQL数据库与关系型数据库的优缺点 关系型数据库 优点:以完善的关系代数理论为基础,有严格的标准,支持事务ACID四性,借助索引机制可以实现高效的查询。 缺点:可扩展性差,无法较好地支持海量数据存储,数据模型过于死板,事务机制影响了系统的整体性能,全文搜索功能较弱。 NoSQL数据库 优点:数据之间无关系,易扩展。有非常高的读写性能,支持大量数据,性能高。有灵活的数据模型,无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
cursor.explain("executionStats")和 db.collection.explain("executionStats") 方法提供关于查询性能的相关信息。这些信息可用于衡量查询是否使用了索引以及如何使用索引。 db.collection.explain() 还提供有关其他操作的执行信息。例如 db.collection.update()。 有关详情信息,请参见 db.collection.explain() 。 评价查询性能 考虑采用以下的 inventory 集合文档: db.inventory.insert([ { "_id" : 1, "item"
简介 TTL (Time To Live, 有生命周期的) 索引是特殊单字段索引,MongoDB可以用来在一定时间后自动从集合中删除文档的特殊索引。 这对于某些类型的数据非常好,例如机器生成的事件数据,日志和会话信息,这些信息只需要在数据库中保留一段时间。 创建 TTL 索引,只需要在使用 db.collection.createIndex() 方法,对字段值为日期或者包含日期的数组设置 expireAfterSeconds 选项即可。 1、如果字段是一个数组,并有多个日期值时,MongoDB使用最低(即最早)日期值来计算失效阈值。 2、如果字段不是日期类型也不是一个包含日期的数组
$concat 拼接字符串操作,返回拼接后的字符串。语法格式如下: { $concat: [ <expression1>, <expression2>, ... ] } 参数可以是任何有效的表达式,只要它们解析为字符串即可。 有关表达式的更多信息,请参阅表达式。 示例 准备以下测试数据: db.inventory.drop(); var rows =
使用 MongoDB 是我们常常会遇到一些特殊的需求需要跨库关联查询,比如订单明细缺商品重量需要补商品重量,而商品重量数据又在商品库中,这事就需要跨库关联操作,示例代码如下: // 使用 order 库,注意语句后面不要加分号 use order var count = ; db.order_detail.find({"store_code":"110"}).forEach(function(_order){ var item = db.getSiblingDB("goods").item.findOne({"barcode":_order.barcode}); if(it
MongoDB 提供 db.collection.explain(), cursort.explain() 及 explain 命令获取查询计划及查询计划执行统计信息。 explain 结果将查询计划以阶段树的形式呈现。 每个阶段将其结果(文档或索引键)传递给父节点。 叶节点访问集合或索引。 中间节点操纵由子节点产生的文档或索引键。 根节点是MongoDB从中派生结果集的最后阶段。 阶段操作描述,例:
cursor.explain("executionStats")和 db.collection.explain("executionStats") 方法提供关于查询性能的相关信息。这些信息可用于衡量查询是否使用了索引以及如何使用索引。 db.collection.explain() 还提供有关其他操作的执行信息。例如 db.collection.update()。 有关详情信息,请参见 db.collection.explain() 。 评价查询性能 考虑采用以下的 inventory 集合文档:
MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。 MongoDB 的安装 我用的是 linux,因此可以用以下命令进行安装:
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 本文将从操作手册、技术研究、会议分享、场景应用等方向给大家推荐干货好文。
Why Spark with MongoDB? 高性能,官方号称 100x faster,因为可以全内存运行,性能提升肯定是很明显的 简单易用,支持 Java、Python、Scala、SQL 等多种语言,使得构建分析应用非常简单 统一构建 ,支持多种数据源,通过 Spark RDD 屏蔽底层数据差异,同一个分析应用可运行于不同的数据源; 应用场景广泛,能同时支持批处理以及流式处理 MongoDB Spark Connector 为官方推出,用于适配 Spark 操作 MongoDB 数据;本文以 Python 为例,介绍 MongoDB Spark Connector 的使用,帮助你基于 M
1、普通单列索引 我们用如下代码来测试: for(var i=0;i<200000;i++){ db.java.insert({name:'xiao'+i,age:i}) } 第一、我们先检验一下查询性能 var start=new Date() db.java.find({name:'xiao156789'}) var end=new Date() end-start 17510
什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。 主要特点 MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。
通过优锐课架构学习分享中,研究什么是MongoDB,什么是NoSQL数据库,以及对现有数据库管理系统的介绍。码了很多实用的笔记,分享 大家参考学习。 1. 目的 在本文中,我们将研究什么是MongoDB,什么是NoSQL数据库,以及对现有数据库管理系统的介绍。 此外,我们将讨论MongoDB功能-为什么使用MongoDB以及MongoDB历史记录。 此外,我们还将通过一些示例查看MongoDB应用程序和MongoDB安装。 2.什么是NoSQL数据库? 在开始之前,我们必须了解NoSQL。 NoSQL或“ Not Only SQL”是非结构化数据库。 它提供了一种使用字段存储和检索数据的功能
关于MongoDB的学习过程由下列的标题号顺序。 一、什么是NoSQL? NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。 在现代的计算系统上每天网络上都会产生庞大的数据量。 这些数据有很大一部分是由关系数据库管理系统(RDMBSs)来处理。 1970年 E.F.Codd's提出的关系模型的论文 "A relational model of data for large shared data banks",这使得数据建模和应用程序编程更加简单。 通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和
虽然官方不推荐使用将业务逻辑存储在数据库中,并且提示在 mongodb 中执行 javascript 存在性能限制。 但实际上,将 javascript 函数存储在 mongodb 中执行,还是非常有必要的,更方便,许多场景下性能会更好(在执行大量查询处理时不需要将数据传回客户端引擎)。 在目前的版本中,我们任然可以将 javascript 函数存储在 mongodb 内置的一个特殊集合 db.system.js 中,然后这些变量就可以在任何 mongodb 的 javascript 上下文中调用,包括:db.eval()、$where子句、mapReduce。 自从 mongodb 3
1:简介 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富、最像关系数据库的。 由于关系型数据库存储对数据之间存在高度的关联,在数据量达到上万亿比特时,关系型数据库所特有的约束和关联就会成为性能瓶颈。非关系型数据库采用了另一种思维方式,即不考虑数据之间千丝万缕的联系,存储也不需要固定的模式,这样无需多余的操作就能成倍地扩展数据量。 MongoDB 支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型,比如:
刚刚接触PF_RING,学习了,O(∩_∩)O 有个问题请教一下九贱前辈:内核中的PACKET_MMAP跟PF_RING有什么不同呢? 感觉PACKET_MMAP跟transparent_mode=0时的PF_RING原理上是一样的( ⊙ o ⊙ )啊...?
4、mmap操作 用户态的接下来调用: ring->buffer = (char *)mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, ring->fd, 0); 复制代码 进行内存映射。 同样地,内核调用相应的ring_mmap进行处理。 Ring选项结构通过ring_sk宏与sk 建立关联 struct ring_opt *pfr = ring_sk(sk); 复制代码
内核版本:Linux 2.6.30.9 PF_RING版本:4.1.0 最近看了一个PF_RING的实现,看了个大概,发上来大家讨论讨论,共同学习。 一、什么是PF_RING PF_RING是一个第三方的内核数据包捕获接口,类似于libpcap。 二、为什么需要PF_RING 一切为了效率,按照其官方网站上的测试数据,在Linux平台之上,其效率至少高于libpcap 50% - 60%,甚至是一倍。更好的是,PF_RING提供了一个修改版本的libpcap,使之建立在PF_RING接口之上。这样,原来使用libpcap的程序,就可以自然过渡了。
内核版本:2.6.12 本文只是一部份,详细分析了连接跟踪的基本实现,对于ALG部份,还没有写,在整理笔记,欢迎大家提意见,批评指正。 1.什么是连接跟踪 连接跟踪(CONNTRACK),顾名思义,就是跟踪并且记录连接状态。Linux为每一个经过网络堆栈的数据包,生成一个新的连接记录项(Connection entry)。此后,所有属于此连接的数据包都被唯一地分配给这个连接,并标识连接的状态。连接跟踪是防火墙模块的状态检测的基础,同时也是地址转换中实现SNAT和DNAT的前提。 那么Netfilter又是如何生成连接记录项的呢?每一个数据,都有“来源”与“目的”主机,发起连接的主机称为“来
大家好,我是良许。 作为 Linux 用户,大家肯定在 Linux 终端下敲过无数的命令。有的命令很短,比如:ls 、cd 、pwd 之类,这种命令大家毫无压力。但是,有些命令就比较长了,比如: $ git push origin HEAD:refs/for/master 这个时候,你要是敲错了哪怕是一个字母,是不是很崩溃? 以前我的作法是,如果敲错了命令,就把光标移动到错误的地方,再进行修改。相信不仅是我,大部分的小伙伴都是这么干的吧。 命令比较短还好,万一命令很长,是不是很抓狂?
周末了,聊点和离职相关的事情,上周应该有不下5个人跟我谈到跳槽离职的事情,每个人的情况都有点不同,每个人我都给了回复,这里总结一下,希望大家对自己的职场有比较明确的规划,跳槽肯定是为了涨薪水的,但是跳槽并不只是为了涨薪水。 问: 这几天在招聘网站上面试后,最后面试了一个外包公司,江苏润和,也在南京。他们给我开了5k,1个月年终奖。我目前的工资是12k,上个月老板刚给我涨了工资,我应该跳槽吗? 答: 当从工资涨幅上来看,涨幅已经很好了,但是我想说的是,我上面隐藏了作者的真实薪水,算是一种保护吧,别来问我问题,我不能把秘密抖出来了。我给的建议是不要着急跳槽,理由如下。 1、第一份工作是职业生
*二哥,你好,我是一名大专生,学校把 Python 做为主语言教给我们,但是我也去了解过,其实 Python 门槛挺高的,所以我在自学 Java,但是我现在并不清楚到底要不要全心的去学 Java,学校里的课程也越来越繁重,而学 Java 又会要投入很多精力,我很纠结疑惑。希望二哥可以给一点建议。二哥看到的话还望百忙之中抽一点时间。感谢!* 这是读者“前进一点”在微信上问我的一个问题,我当时给他的回复是“Python 挺火的,学 Python 就好。”但当我在 B 站上看了羊哥的一期视频后,深感懊悔,觉得自己给出的建议是不负责任的。 意识到自己的问题之后,我就赶紧给读者“前进一点”发了一条信
我的一些朋友问我有关OLTP,MPP和Hadoop的问题。我试图解释如下。 这与撰写本文的时间有关。事情变化如此之快:)。 OLTP数据库(Oracle,DB2)与MPP(Netezza,Teradata,Vertica等): 1.-DB Oracle或DB2需要在开始处理之前从磁盘读取数据到内存,因此内存计算非常快。 -MPP尽可能使处理接近数据,因此减少了数据移动 2。-DB Oracle或DB2适合较小的OLTP(事务)操作。它还保持了很高的数据完整性。 -MPP适用于批处理。一些MPP(Netezza,Vertica)忽略了Intigrity,例如为了批处理性能而强制执行唯一密钥。
LSM-tree 上的读路径,从出生就带着镣铐。因为 CoW 的使用,读一条记录实际上需要把这条记录所有的增量碎片都找到。因为横跨内存和磁盘两种介质和有层次化的存储,这些碎片可能藏在各种犄角旮旯里面。更惨的是,如果是读一个范围内的记录,俗称 range scan,因为 LSM-tree 的每一层的 key range 是交叠的,那么一个 range 内的数据就很有可能会落在所有的层次上,为了把他们都找到,我们就需要每层都去读,这个工作量也不小。
在 Linux 下工作,打交道最多的就是文件了,毕竟 Linux 下工作一切皆文件嘛。Linux 也为大家提供了多种用于处理文件的命令,合理使用这些命令可以大大节省你的时间,并让我们的工作负担不再那么沉重。 寻找文件的技巧 当我们查找文件时,第一时间想到的肯定是 find 命令。但是如果我们搜索的路径范围比较大时,花费的时间会比较多,在这个情况下 find 命令就不是最优的方式了。 我们可以使用 ls 快速找到近期更新的文件。比如,想知道自己昨天离开办公室回家前调用的脚本吗?小case嘛!使用 ls 命令并加上 -ltr 选项。最后一个列出的将是最近创建或更新的文件。
1. 前言 resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。 resultMap 可以将查询到的复杂数据,比如多张表的数据、一对一映射、一对多映射等复杂关系聚合到一个结果集当中。日常的业务开发通常都会和它打交道,今天就对
大家好,我是良许。 在我们的日常工作中,需要我们重复做的工作简直不能太多。比如,我们想要确认网络是否是连通的,传统的做法就是使用 ping 命令不停去测试某个地址(比如百度)。网络比较好还好说,但如果网络很差,那么就需要一直去运行 ping 命令。 作为程序员,重复性的工作怎么能忍呢?只要是重复性的工作,就有可能使用编程的方式来解决! 下面良许就介绍两种方法重复执行一条命令直至运行成功。 (PS:本文适合初学者,高手可绕道) 解决重复性的工作,自然而然会想到循环 。在 Shell 里,循环无非 3 种:for、while、until 。在本文里,我们使用后两种循环:while 、un
相信有些读者已经听说过 DRY 原则,DRY 的全称是 —— Don't Repeat Yourself ,是指编程过程中不写重复代码,将能够公共的部分抽象出来,封装成工具类或者用抽象类来抽象公共的东西,从而降低代码的耦合性,这样不仅提高代码的灵活性、健壮性以及可读性,也方便后期的维护。 接下来,本文将介绍在 TypeScript 项目开发过程中,如何参考 DRY 原则尽量减少重复代码。减少重复的最简单方法是命名类型,而不是通过以下这种方式来定义一个 distance 函数: function distance(a: {x: number, y: number}, b: {x: numbe
1. 前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行。那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案。 第一种方案是在容器启动后手动导入,太low了不行。第二种在Spring Boot客户端连接Mysql容器时初始化数据库,你可以参考使用flyway进行数据库版本控制一文,但是这依赖客户端的能力。能不能做到Mysql容器启动时就自己初始化数据库呢?当然可以!今天就来演示一下。全部代码见文末。
前言 近期开发与钱相关的项目,在高并发场景下对数据的准确行有很高的要求,用到了for update,故总结一波以便日后留恋。 for update的使用场景 如果遇到存在高并发并且对于数据的准确性很有要求的场景,是需要了解和使用for update的。 比如涉及到金钱、库存等。一般这些操作都是很长一串并且是开启事务的。如果库存刚开始读的时候是1,而立马另一个进程进行了update将库存更新为0了,而事务还没有结束,会将错的数据一直执行下去,就会有问题。所以需要for upate 进行数据加锁防止高并发时候数据出错。
新的一周又开始啦~大家应该都知道关于PHP中字符串的操作是程序设计中比较关键也是最基础的部分,那么在后面的文章中会陆续给大家介绍关于字符串的基础操作,相信总有你能掌握到的技巧~ 那么本文的主题则是“编写一个PHP程序来查找给定字符串中的第一个非重复字符”。 对于非重复字符,应该不必过多解释,比如字符串“adicvdda”,肉眼可见第一个非重复字符就是i,因为字符a和d都是重复的。 下面我们就给大家介绍怎么通过PHP来实现这个操作。
在上一篇文章《如何通过PHP查找给定字符串中的第一个非重复字符》中给大家介绍了怎么通过PHP查找给定字符串中的第一个非重复字符。感兴趣的朋友可以学习了解一下~ 那么本文将给大家介绍怎么获取前n个元素的数组,什么意思呢? 我们来看看具体的问题描述:如何编写一个PHP程序来获取一个数组,其中从给定数组的开头删除了n个元素。 还不明白也不要紧,我们直接看代码:
相信大家都知道,在PHP中有一个非常强大的函数,就是date函数,那么通过date函数就可以轻而易举获取星期几。但是正如标题所述,本文将给大家介绍的是怎么通过PHP switch显示星期几,感兴趣的朋友不要错过啊~ 同样,我们要详细的介绍问题:如何编写一个程序,使用 switch/case 语句根据数字显示星期几(例如:星期一)。 问题很清晰,答案也很好实现: