CrazyCodes

CrazyCodes 查看完整档案

北京编辑北京邮电大学  |  计算机信息技术 编辑学两招  |  PHP开发工程师 编辑 blog.fastrun.cn 编辑
编辑

https://github.com/CrazyCodes... 我的博客
_
| |__ __ _
| '_ | | | |/ _` |
| |_) | |_| | (_| |
|_.__/ \__,_|\__, |

         |___/   感谢生命可以让我成为一名程序员

                         CrazyCodes To Author

个人动态

CrazyCodes 赞了文章 · 1月21日

有道云笔记新版编辑器架构设计(上)

在开发有道云笔记的新版编辑器的过程中,我们遇到很多实际问题,愈发感觉到这是一个非常有深度的前端技术领域,所以我们将新版编辑器的技术选型、架构和部分实现细节拿出来分享给大家,希望对大家开发富文本编辑器、做复杂系统的架构设计有一定参考意义。

作者/ 金鑫

编辑/ Ryan

来源/ 有道技术团队(ID: youdaotech)

1. 富文本编辑器背景

1.1 什么是编辑器

编辑器在前端开发领域是指可以提供给用户编辑纯文本、富文本、代码、多媒体内容等的功能模块,例如以云笔记为例,编辑器指下图中绿色的区域。

有道云笔记编辑器界面

编辑器一般由编辑区域、光标、工具栏、右键菜单等功能模块组成,一般都包含编辑文字、设置文字样式、设置段落样式、插入多媒体内容、撤销重做、复制剪切粘贴等功能。

1.2 编辑器发展简史

编辑器的由来可以追溯到打字机时代,下图是一个常见的打字机。

我们可以将打字机的构造与编辑器进行类比,打字机的纸张对应于编辑器的编辑,打字机的游标对应于编辑器的光标,甚至敲击键盘的表现,编辑器也与打字机一脉相承:

  1. 当敲击字母时,在光标后输入该字符;
  2. 当敲击空格键时,在游标之后插入空格;
  3. 当敲击回格键时,删除游标之前的字符;
  4. 当敲击换行键时,游标换到下一行开始;

而在计算机中,出现的最早的是文本编辑器,例如我们在 Linux 系统中常用的 vi,vim,emacs 等,它们可以对纯文本数据进行编辑,并引入了撤销重做、复制剪切粘贴、查找替换等编辑器的核心功能。

随着用户图形界面的兴起,人们对于文本的编辑不止满足于纯文本了,还需要给文本段落加上各种格式和排版信息。

同时,人们对于在文档中插入图片、图形、表格等更丰富格式的需求也越来越多。为了满足这些需求,富文本编辑器就出现了,其中的集大成者就是微软的 Word 和金山的 WPS。

Word 和 WPS 可以说将桌面客户端中的富文本编辑器做到了极致,至今也是功能强大的富文本编辑器。

但是它们的设计初衷就是做一款单机的文字处理软件,自然会遇到不支持互联网上的音视频格式、存储备份依靠本地计算机的文件系统、多人协作依靠文件拷贝等问题。

在互联网遍及千家万户的今日,人们反而不太需要 Word 提供的交互复杂的各种强大功能,而是需要支持更多互联网数据格式、存储备份更加方便、能够提供多人协同编辑功能的轻量级富文本编辑器。

基于浏览器的富文本编辑器就是在这样的设计思路下产生的,其中的代表产品有 Google Docs、有道云笔记、印象笔记、石墨文档等。

这些基于浏览器的富文本编辑器都有以下特点:

  1. 利用 Web 技术开发,需要在浏览器环境中使用;
  2. 功能相对 Word 更加简单,只保留了最常用的富文本编辑功能;
  3. 支持图片、附件、视频、音频、地图等多种互联网资源;
  4. 可以将文档备份在网盘中,实现多端同步;
  5. 文档可以分享查看,可以进行多人实时协同编辑。

当然基于浏览器的富文本编辑器,也是经过了几轮的技术迭代和创新,才到了今天这种百花齐放的局面。

1.3 基于浏览器的富文本编辑器四要素

在现代的浏览器框架下,利用 Web 技术开发一款富文本编辑器,一般采用经典 MVC 模型,根据数据模型渲染视图,视图操作通过控制器修改数据模型。具体要解决以下四个问题:

模型:

模型包含内存模型和存储模型。存储模型是数据存储、同步和备份时的模型,需要考虑带宽、存储体积、模型序列化效率、模型正确性验证效率等因素。内存模型则是数据渲染时的模型,结构一般比存储模型复杂,会在存储模型的基础上添加其他渲染时需要用到的属性。

渲染:

渲染指如何将内存模型渲染成 Web 页面。所有的基于浏览器富文本编辑器都将内存模型渲染成为了 HTML 页面。但是它们在排版上的策略略有不同,大多数编辑器都采用了基于 HTML 和 CSS 的排版方式,也有少数编辑器自己实现了排版引擎,例如 Google Docs。

编辑:

编辑指如何提供编辑区域让用户在编辑区域编辑文档,以及如何感知用户编辑区域的编辑动作通知控制器以修改数据模型。浏览器提供了 contentEditable 的属性可以把元素变为可编辑状态,大部分编辑器都是以这个思路进行编辑的,并且它们可以拦截 contentEditable 元素的事件,将事件通知给控制器。也有少数编辑器自己实现了编辑区域和事件系统,例如 Google Docs。

指令:

指控制器根据收到的编辑区域的编辑动作,生成对应指令修改内存模型,内存模型得以更新完成循环。这部分与数据模型相关,如果数据模型是 HTML,编辑器可以通过 execCommand 直接修改 HTML 数据,如果是自定义数据,监听或拦截编辑区域上的事件,也可以推测意图生成出修改数据模型的指令。通过指令修改数据,可以更方便的实现撤销重做、历史版本恢复、协同编辑等功能。

1.4 基于浏览器的富文本编辑器技术演进

基于以上四个问题,可以将基于浏览器的富文本编辑器划分为四代:

第一代:

完全基于浏览器 API 设计,数据模型直接采用 HTML 数据,渲染用原生 HTML,编辑区域用 contentEditable 生成,通过 execCommand 执行浏览器自带的修改 HTML 数据的指令。

这类编辑器一般都出现在各类《XX 行代码教你实现富文本编辑器》的博客里,基本没有成熟的开源编辑器或者商用编辑器采用这一种设计方式。它们的主要问题处在 execCommand 接口上:

  • 只提供了有限的几个命令,例如 execCommand 就没有办法支持插入待办列表。
  • 提供的命令有些有功能受限,例如 'fontSize' 命令只能支持 1-7,导致不能自定义字体的大小。
  • 修改的结果与浏览器有关,例如 'bold' 命令在一些浏览器上会给选区中的文字添加标签,而在另一些浏览器上则会添加标签。

第二代:

由于 execCommand 功能上的限制,第二代的编辑器普遍抛弃了用浏览器的 execCommand 接口直接修改 HTML 文档的办法,而是用自己实现的 execCommand 和指令修改 HTML 文档,这样做就可以实现更加灵活多样的功能。

这类编辑器的主要问题是:不同的 HTML 结构可能表示的含义一样。例如下面两行 HTML 都表示一段既加粗又斜体的文字,但是他们的 HTML 结构却不一样,这样对比较数据是否一样就变得非常困难。

第三代:

针对 HTML 含义不一致的问题,第三代编辑器则抛弃了既用 HTML 做文档模型,又用 HTML 做渲染的策略,而是采用自定义的数据模型,例如 XML 数据模型或者 JSON 数据模型。同样的数据模型渲染生成的 HTML 一样,自定义的操作则可以保证同样的操作修改之后的文档模型也是一样的。

目前常见的编辑器产品例如:有道云笔记、石墨文档等,以及开源的编辑器库例如 Slate、Draft、Quill 等,都是第三代编辑器,它们已经能够满足大多数应用场景。但是由于渲染出的页面中,可编辑区域还是基于 contentEditable,需要根据拦截的事件判断用户行为,生成对应的指令修改数据模型。一旦有用户数据没有拦截,或者处理的行为不对,用户的行为就可能直接修改了 contentEditable 的元素,导致数据和视图的不一致。因此产生的 bug 定位和修复都比较难,在编辑器的移动端适配中经常出现。

第四代:

为了解决 contentEditable 引起的不可控事件,以 Google Docs 为代表的第四代编辑器则彻底抛弃的 contentEditable,自己实现排版引擎。排版引擎控制了文档的页面和布局,将数据渲染成为页面上的HTML。同时由于抛弃了contentEditable,还需要解决实现光标和选区的绘制、监听文字输入事件等技术问题,才可以做到和浏览器类似的编辑体验。

第四代编辑器相对于第三代,优点是彻底解决了contentEditable 引起的 bug,有更好的可扩展性。对应的代价是开发难度更高、体验不如原生、可能会遇到性能问题。目前只有 Google Docs 等采用了这种架构开发编辑器。

2. 云笔记新版编辑器技术选型

根据上节所述的实现富文本编辑器的四要素,我们总结了四代编辑器的技术选型,如下表所示:

有道云笔记新版编辑器综合了项目的可扩展性和实现难度,作出了以下的技术选型:

  • 模型:自定义的 JSON 数据格式作为内存模型,它的压缩版本作为存储模型;
  • 渲染:借助浏览器排版,用 React 框架渲染视图;
  • 编辑:不依赖 contenteditable,拦截浏览器事件判断用户交互,自己实现了光标和选区;
  • 指令:实现了丰富的自定义的富文本编辑指令,重新实现了 execCommand 执行指令。

2.1 模型

有道云笔记新版编辑器采用了自定义的 JSON 数据格式作为内存模型。存储模型与内存模型基本对应,是内存模型的压缩版本,这样可以减少在数据序列化和反序列化过程中出现的错误。

文档模型:

新版编辑器的内存模型采用了文档-段落-文本的三层模型,顶层对象是文档(下图黄色区域),一篇文档包含多个段落(下图蓝色区域),每个段落中有至少一个文本(下图红色区域)。

对于三层的文档模型,我们可以很自然的想到用树的结构来表示它,如下图所示:

由于 JSON 格式天然的就可以表示嵌套的树状结构,所以我们的三层文档模型可以表示为以下的 JSON 结构:

富文本表示:

对于富文本编辑器的数据模型,需要考虑文本的行内样式和段落样式:

行内样式是作用于文字的样式,每个文字都可能有不同的行内样式,例如文字的粗体、斜体、文字颜色、背景色、字体、字号等

段落样式是用作与段落的样式,整段文字只会有一个段落样式,例如对齐方式、行高、段落缩进等。

由于我们三层文档模型中段落是单独一层,有对应的段落节点,所以对于段落样式只需要在段落节点上添加表示段落样式的字段,我们是在 paragraph 添加了 data 字段,其中添加了 style 属性表示该段落的段落样式,如下图所示:

如果要表示行内样式,目前文本节点中只保存一个 content 字段就没有办法胜任了,需要将它拆分为一个一个字符在每个字符上添加表示行内样式的字段,例如我们可以用一个 chars 数组,里面的每个元素表示一个字符,text 字段表示字符的内容,marks 数组表示字符上的行内样式,如下图表示 a rich text。

叶子节点:

上述的富文本行内样式的表示方法中,我们可以看到rich的样式粗体、斜体、红色背景色保存在了 r, i, c, h 四个字符上,存在着冗余数据。我们参考了HTML渲染结果和部分开源编辑器的实现定义了合并规则。

如果连续的字符节点,具有完全相同的行内样式,则它们可以合并成一个叶子节点。

例如上面的例子里,r, i, c, h 四个字符连续且具有完全相同的行内样式,它们是可以合并成为一个叶子节点的。类似的 “a ”、“ text” 也分别可以合并成叶子节点,所以我们可以将文本节点简化表示为:

综上, 简化后支持行内样式的文本节点也是一个树状结构,它包含一个或多个叶子节点,每个叶子节点包含文本的内容和这些内容共同的行内样式,且相邻的叶子节点的行内样式必须不完全一致,如下图所示:

2.2 渲染

云笔记新版编辑器依旧采用了浏览器进行排版渲染,没有像 Google Docs 那样自研排版引擎,原因是我们认为浏览器的排版引擎已经足够强大,基本满足日常的文本编辑需求,只有诸如图片的文字环绕、分页、分栏等比较高级的功能无法实现,而自研排版引擎需要大量的开发和测试工作量,还可能会产生性能问题,所以我们暂时还是用来浏览器进行排版和渲染。

我们采用了 React 框架,采用了组件化的方式渲染数据模型。针对文档-段落-文本的三层数据模型,以及文本节点的叶子模型,我们设计了对应 React 组件嵌套进行渲染,如下图所示:

  • Document 组件渲染文档数据。
  • Paragraph 组件渲染段落数据,它是 Document 组件的子组件。
  • Text 组件渲染文本数据,它是 Paragraph 组件的子组件。
  • Leaf 组件渲染叶子节点,它是 Text 组件的子组件。

对于叶子节点包含的文本片段和行内样式,只需要渲染成一个带 style 属性的<span>标签就可以了,这也印证了我们设计的富文本模型,简化了富文本的渲染逻辑,使得富文本渲染代码变得非常的轻量化。

以上是本期文章的全部内容。
下周三,我们将推送《有道云笔记新版编辑器架构设计(下)》,继续分享关于编辑指令的内容,并进一步讲解新编辑器的分层架构。
敬请关注有道技术团队。

- END -

查看原文

赞 16 收藏 6 评论 4

CrazyCodes 赞了文章 · 1月20日

[讨论]青春饭的程序员都在害怕 35 岁,那你之前在干什么?

社会一般人对程序员有几个固有认知,而且大部分程序员看上去也是这般:

[x] 工作累加班多,身体差,熬夜容易死;

[x] 不修边幅甚至有点邋遢,榆木脑袋;

[x] 中年危机严重,35 岁将被公司淘汰;

[x] 单身,找女朋友是一件困难的事;

为什么这么说呢,但凡我们细心留意一下,就会发现网络上关于中年危机35岁被辞退单身程序员相关的关键字几乎都是连在一起的。我们来看几个具体的例子:

•程序员到了 35 岁就要被裁员?•35 岁的码农年后第一天被辞退;•程序员的中年危机:拿什么拯救你,我的三十五岁;•程序员工作职能做到 35 岁吗?之后的路是怎么走的呢?•程序员单身真的是有理由的吗?•程序员年薪高到 40 万,为什么还有很多程序员单身?

似乎人人都在担心 35 岁,甚至是 30 岁这个而立年龄。30 岁本因该当打之年,为什么就要被优化掉呢。说到这里,你可能会说这是社会整体趋势,是大环境造就的,谁都不想。

不错,目前社会大环境确实如此,连正在写文章的 30 岁的我,也努力地做打工人。不过对于 35 岁的中年危机,我自己是不担心的,这么说并不是因为我心态好或者不寻求在大城市生根发芽,而是因为我提前做了一些预备

一般程序员的工作和生活

在开始聊预备话题之前,我们先来捋一捋一般程序员的工作和生活,就拿我自己和身边的人作为引子吧。

时间分配

我自己在北京互联网类的公司做研发工作,认识的大部分人都是程序员,有职级比较高的、也有比较普通的。从以往在技术群里面的交流来看,大部分人的生活都分为:工作休闲生活放松玩乐。休闲生活和放松玩乐指的是人类正常生活,例如做饭、陪伴家庭、逛街购物、看电影玩游戏之类,偶尔会有一些学习的时间。相信现在正在看文章的你也是这样。当然,部分人会有一些爱好,例如跑步、骑车、打篮球,这些就划到放松玩乐里面。

不过并不是所有人都按照这个时间比例进行分配,也有人熬夜玩乐,第二天照样能够划水上班的。

经济分配

挣钱当然是要用的,家庭开支生活吃穿学习投入玩乐开销,基本上能够涵盖大部分人的经济分配,这里也不排除一些炒股或者购买基金这类理财产品的情况,那么理财投资也算是一种。

收入渠道

今天的重点,其实是围绕着收入展开的,前面的铺垫也是为了好好聊聊这部分内容。相信大多数人的收入渠道都只有一个:工作收入。上面提到了理财投资,这个也是收入渠道里面的一种。作为程序员,偶尔会遇到一些公司愿意支付费用邀请你帮忙处理一些事,这是工作以外的收入,也是收入渠道里面的一种。

看到这儿,想必聪明的你已经知道关注点在哪里了。没错,支出项多,收入项少。如果你的收入抵不上支出,那么就会陷入泥潭,会觉得工作压力逐渐变大,进而影响到你的心理状况,很容易造成焦虑。

如果这时候正好是 30+ 岁,工作体能和加班能力比不上 二十六七的小伙子是很正常的。假设公司业绩不好,你被优化掉了,那么你的收入项里面比重最大的那部分就没有了,只剩下比较少的那部分,甚至什么都不剩下。入不敷出,这就是程序员们都害怕 35 岁的根源。

基本概念,资产与负债

一般人要摆脱 35 岁困顿,首先要明白一个基本概念:资产负债,这是我当初阅读《穷爸爸和富爸爸》中获得的唯一知识点。这里不咬文嚼字,我们朴实无华地聊。资产大体指的就是能够为你持续创造收益或者大幅度减少资金流失的东西,例如房子、你买的理财产品等。负债大体指的是一次性消耗或者持续不断消耗你的资源或资金的东西,例如你为了追求时尚买的 iPhone 最新款 Pro Max。

当然,资产和负债并不是固定或者绝对的,例如汽车。对于一个做生意或者跑业务的人来说,如果汽车能够直接/间接地创造收益,那么汽车就是他的资产。如果跟你我一般,只是为了不挤公交、不坐地铁而用来代步的汽车(实际上上班开车也不太现实,很多年轻人买车就是为了周末去玩或者放假回家),那它这时候就是一个负债,因为你需要为它支付保险、保养费用、油费等等费用。

要注意的是,除了跟钱有关的物品之外,跟时间有关的东西也可以这么划分。例如你非常喜欢玩一款游戏,每天下班必定玩几局,将几个小时都分配给了这个游戏,那么它就是你的负债。

斩断情丝,减少负债

在你弄明白资产和负债后,可以现场梳理一下手头的资产和背负的负债。将家中的物品罗列一个清单,在清单上给物品打上资产或者负债的分类标记,然后计算它们对应的金额。

考虑一下,要不要把那些负债跟你的情丝斩断。

围水造田,开源节流

上面的斩断情丝,其实就是在节流。除了负债之外,思考一下有哪些是不必要/可以优化的花销,把这些花销降低或者消除。例如你固定每周都会上一次饭店,是不是可以调整为两周去一次?

下面聊聊开源,即开辟更多的收入项。相信看完上面文章的时候你自己心里已经算过了,自己的收入渠道也就那两三项,如果真的有一天被优化掉,是不是意味着生活堪忧了呢?

程序员这个群体能够围水造田的事其实很多,我们来捋一捋:

[x] 技术付费,比较直接的说法是接外包,也就是凭借技术能力获得别人支付费用;

[x] 经验付费,例如独立咨询或顾问,凭借多年工作经验为企业或单位提供有价值的指导或服务;

[x] 跨界合作,例如餐饮连锁软件、营销工具,与其他行业的公司合作,对他们的同行进行降维打击;

[x] 知识付费,在线教育这么火热,无论是视频专栏、图文专栏还是训练营,都是很不错的选择;

[x] 产品付费,根据自己对多年工作所在领域的理解,提供一整套解决方案或者可用的产品;

[x] 作品付费,书籍的分红虽然不高,但是销量可观的话,收入不菲;

[x] 自媒体,短视频爆发的年代,很多人都通过自媒体实现了自己的财富自由,你何不尝试呢?

上面这些都是比较容易接触到,且可落地实施的事。虽然你还没有开始,也不知道从哪里开始,不过通过这篇文章总算是有一个清晰的认知了,可以提前往这些方向上靠拢。例如提前聚集人气、熟悉市场等,为自己后续的动作打下基础。

从现在开始做,慢慢增加自己的收入项,这样就算那天真的被优化掉,也能够不慌不忙。如果围水造田做得好,说不定早早就能够退休了呢。我自己的计划已经确定了,35 岁之前能够自己做主退休,不知道你有何计划?

这里是微信公众号 Python 编程参考,如果你觉得这篇文章对你有帮助,请来关注我哦。点击前往作者专栏 https://www.weishidong.com,看更多有用知识。

说明:部分图片截取自网络,如有侵权请联系 vansenb@foxmail.com[1]

References

[1] vansenb@foxmail.com: mailto:vansenb@foxmail.com

查看原文

赞 1 收藏 0 评论 0

CrazyCodes 赞了文章 · 1月19日

漫画 | 遇上个傻屌领导是什么体验??

今天这篇漫画的灵感来源于知乎的万赞回答,也有一部分原因是因为最近工作状态的真实写照吧, 它讲述的是程序员工作中的bug是如何产生的,以及作为一名优秀的程序员,如何把握好你跑路的时间呢?

一起来看看发生了什么吧……

情节纯属虚构,如有雷同,纯属巧合..

1
2
3456789101112

编后

俗话说:千里之堤,溃于蚁穴,作为一名程序员,或多或少都有类似的经历吧,一个小小的bug,即能把整个系统搞挂。

而bug的产生,大多源于遇上不懂技术的领导或老板,到处跟业务部门、客户等吹牛逼,保证项目开发能有多快、多好、多稳,但当真正需求出来后,经过开发人员评估,时间远远超出他吹牛皮的范围,然后就开启了压迫模式,逼程序员加班加点,缩短项目周期来补全他的面子,导致项目基础构架不到位,测试用例范围不够广,就像漫画中的情节一样,地基不牢,摇摇晃晃勉强上线了,后期无法维护,改一个地方有十个地方会受到影响,用户的行为超出测试用例范围外,系统立刻崩溃~,然后老板知道后,颜面尽失,反过来又指责程序员.

到最后程序员无法忍受,只好跳槽跑路,新来的接盘侠对项目完全不了解,在迷宫一样的系统里垂死挣扎,改好一个bug引发了另外100个问题,如此反复循环……,而老板/领导完全自我良好,认识不到自己的问题…

程序员真的是太难了…

参考资料

  • Bug是如何产生的
  • www.zhihu.com/question/365343579/answer/967299388

文中部分素材来源网络,如有侵权,请联系删除

话说王大拿跑路之后,
去了哪里?
发生了什么意想不到的事呢?
敬请期待下一篇哦~...

本文系 “ 前端布道师 ” 原创
转载请先微信联系苏南 (su-south)授权,并标明出处!

撰稿:苏南、哒柏
插画 / 排版:苏南

往期回顾

image
image
小公司卧薪尝胆三年,意外拿到美团offer
人到中年,一地鸡毛
前端发展史的江湖恩怨情仇
揭密微信是如何诞生的?

前端布道师-苏南著作

更多精彩,欢迎关注我们

本文首发于公众号:前端布道师

链接:https://mp.weixin.qq.com/s/um1mYo3k0i8OAtdnTr_a7w

转载请联系微信:su-south 授权

用漫画解读前端技术,执笔演绎程序人生,愿吾手中笔,能博君(卿)一笑
Github地址:更多有趣漫画https://github.com/meibin08/comics-program-life欢迎 Star、watch

查看原文

赞 10 收藏 2 评论 5

CrazyCodes 关注了用户 · 1月13日

沈唁 @sy_records

GitHub:@sy-records

新浪微博:@你飞

公众号:沈唁志

Welcome to follow me

关注 70

CrazyCodes 发布了文章 · 1月1日

2021 PHP程序员修炼秘籍

image

前言

嗨喽,大家好,我是CrazyCodes,祝思否的小伙伴新年快乐,依照惯例,在2021年的第一天,为大家献上2021年PHP程序员修炼秘籍

2020

回顾2020年,新冠病毒肆虐全球,不易的一年,就这样一晃而过,还记得2020年的春节,全国洋溢着春节的气息,当疫情爆发的那一刻,举国上下齐心协力,抵御疫情,致敬奋战在一线的白衣天使、抗疫工作者!

WechatIMG61.png

语言

在编程语言社区 TIOBE 发布的 12 月份的编程语言排行榜。根据表中显示,12 月 C 语言排名第一,Java 降至第二位,Python 排列第三,与去年同期相同。C++、C# 分别位列第四、第五
image.png
我们PHP开发语言在第八位,我说这些想表达什么呢?是想要告诉广大的PHP开发工程师,不要被社会焦虑所控制,这一年来在知乎、简书、CSDN等等各渠道看到的很多文章,标题大概是这样的《PHP还能活多久》《PHP为什么会成为冷门》等等一系列的描述,前两年文章中我会列出一些数据来说明PHP还在不断发展或者说明PHP的市场占有率,这次不在做相关的阐述,以下说几点

  • 语言只是工具,当你做一个WEB应用你会选择PHP或JAVA,如果你需要处理大量数据,我会推荐你使用Python
  • 存在即合理,每门语言都有它的历史发展,为推动社会所作出的卓越贡献。
  • 不同语言所涉及的领域不同,如果你边用PHP搬砖,边看着人家开发桌面应用,恐怕你只有看着的份。
  • 根据不同需求选择不同语言,不必再纠结哪个会活哪个会死
  • 社区的不断发展壮大是开发语言发展的助推器

如果你真的喜欢PHP这门开发语言,那就去PHP相关社区多做贡献,以体现你真的热爱它。

基础

我是一名北邮计算机专业的自考生,在自考的过程中,深有体会计算机基础对一名程序员的重要性,我见过很多程序员吐槽很多公司面试要出一些算法题,数据结构题,要是面大厂,就说大厂苛刻,面中厂小厂,就说人家学大厂。其实我以前也是这么想的,但自从开启了基础知识学习的那一刻,我开始蔑视自己以往的想法。

可以这么说吧,如果你没有看过C,没有学习过数据结构,操作系统,你不会写出好的代码,更别提成为一个牛X的程序员。这个为什么不能,一言两语说不清楚,如果你感觉我在吹牛皮,不妨去学习下,并且带着你的认知来反驳我

奉上我的自考科目,自考科目与统招学习的科目不同,难度会降低不少,你可以先从这里开始

  • 《数据结构导论》
  • 《操作系统概论》
  • 《软件开发工具》
  • 《数据库系统原理》
  • 《C++程序设计》
  • 《计算机网络原理》
  • 《高级语言程序设计(一)》

无论你是做什么语言开发,在什么行业,C语言是你必须精通的一门语言,可能你会说“什么?要精通?”,在你跟我抬杠前,先至少熟悉了在来。

这这里我再分享下,今年我在极客时间购买的课程 (排名不分先后)

  • 陈旸老师的 《SQL必知必会》
  • 刘超老师的 《趣谈网络协议》
  • 张磊老师的 《深入剖析Kubernetes》
  • 陶辉老师的 《Nginx核心知识100讲》
  • 丁奇老师的 《MySQL实战45讲》
  • 陈皓老师的 《左耳听风》

如果你对我的路线感兴趣,非要让我推荐一个课先来学习的话,我推荐你购买陈皓老师的《左耳听风》,如果非让我给一个理由,那么我的理由是“先静心”

框架

image.png

2020年Laravel框架热度不减,生态圈也在不断壮大,我也是Laravel框架的重度使用者。但今年我不会强烈推荐你去学习它。

这要看你所处的环境与你需要做的应用,如果你身处一家小公司,其要求是快速迭代,那么Laravel框架会是你的首选,当然如果不是一家创业公司,其已经有了稳定的用户及一定量级的数据,那你也没得选,公司用什么你用什么。

不同场景,不同量级,选择不同的框架,这是一名理智的程序员可以做出的选择。

我强烈推荐你去学习使用 Swoole 与 Hyperf , 就算你不知道协程是个啥。

框架是语言更上层的东西,这里就不做过多阐述了。

如果你是一名新人,在研究到底选择怎样的一个框架去开启你的程序之路,那么我的建议是随便选一个就好。

PHP 8

image.png
PHP8带我们进入了一个全新的世界,是PHP历史发展过程中重要的里程碑。

你在实际工作中可能无法使用它,但我强烈强烈强烈建议你在本地安装并尝试使用它。

PHP官方关于PHP8的介绍,PHP官方还从来没有因为新版本单独拿出一个页面展示,可见官方对齐的重视

我之前有写过一篇相关文章,放到了下方。

社区

技术社区与技术讨论群在这里我一并讲下,学习的方式分两种,一种是主动学习,一种的被动学习,主动学习不多说,就是你主动去学习了解一些事物,被动学习这里指的是浏览技术社区和技术讨论群,保持持续学习的热情是必须的,但也要允许自己堕落一会,大脑长时间保持高速运转,人是受不了的。当你堕落的时候,不知道学点什么的时候,不妨溜溜技术社区,找些感兴趣的文章读一读,就当是课外读物了。

技术的深度和广度是同时存在的,深度代表你对某个领域的专业程度,广度则是对整个行业的宏观理解与认识。做一个有深度,有广度,有态度的程序员吧。

技术社区我经常逛这些,不要贪多,有几个就行

  • Segmentfault
  • Csdn
  • 掘金

关于技术讨论群,找一些话题讨论有深度的加入,这里的深度并不仅仅指的技术层。

如果在你的群列表内,经常出现有人问这段代码为什么报错,这个基础东西该怎么搞,或者天天有人让你砍一刀,建议你趁早退出,俗话说得好,物以类聚人以群分

English

英语,众所周知,是一门沟通语言,在计算机发展长河里,英语占有重要地位,看不懂英文,在技术这个行业里,就像你在中国不识字是一样的。

当然学习英语是一个保持持续热情的事情,如果你坚持不下来,但在日常开发中还躲不掉,这里我教你一个退而求其次的招数,你是不是经常打开github或者某个英文网站,英文文档,右键翻译该网站?我建议你在翻译前,先把要翻译的这段英文copy出来,对比着翻译后的结果,你可以大体知道哪个英文对应的中文是什么,久而久之,你看得懂的英文就会不断增加。

当然,这是一个最最差劲的办法,如果你还是想系统的学习,我这里还有个狠招,“消费你的人民币”,人都是有惰性的,这是人的天性,如果不用上班就可以有无穷无尽的财富,我想上班的人不会太多,报一个英语学习班,我指的是现场授课的那种。并不是某个英语学习APP,花个99元就想通读各大英文书籍文章。

当你花了钱,并且坐在教室里,会有一种莫名的驱动力驱动你这样去做。不妨试试?

创业

image.png

当你工作很多年后,肯定会多多少少有一些创业的想法,作为一名失败者,我劝你三思而后行,但也鼓励你激进做事。

拉卡拉董事长孙陶然先生对于创业者有这样一句忠告 “创业就是,做一个有人用的产品,并且把这个产品卖出去”

这是作为一名创业者首先要做的事情,而非所谓为了梦想。这也是一个很现实的事情,不是每个人都能做到像滴滴、抖音这些明星企业一样。

创业成功本身就是一件小概率事件,当你迈上这条路,首先你的技术就不是你的核心竞争力了。

每每写到创业,我都想多描述些,但碍于我也是一名失败者,作为一名失败者去教你如何创业,恐怕你失败的概率比我还高,就跟那些天天演讲成功学的“专家”,如果他成功了,恐怕不会去演讲这个东西。一个失败人去讲成功学,会把成功学讲的更失败。

如果你希望了解我的创业故事,可以私信我。

我很乐意把我的经历描述跟你听。

最后致敬所有的创业者,这个时代的逆行者。

致谢

如果你没细看我上面啰嗦的那些,那你可以看看这里的总结

  • 不要被贩卖焦虑
  • 保持持续的学习热情
  • 允许自己一时的堕落
  • 拥有扎实的基础
  • 要熟练使用C语言
  • 英语不能忽视
  • 创业要做足准备

感谢你看到这里,2021 我会在思否发布自己电商设计的录播课,也是我首个录播课。

希望本篇文章可以帮助到你,谢谢。

查看原文

赞 18 收藏 8 评论 6

CrazyCodes 赞了文章 · 1月1日

思否年度有奖征文丨你的 2020 留下了哪些印记?

image.png

2020年已经结束,这一年过的太快,让人产生了一种虚幻而错乱的穿越感,仿佛上一秒还在年初,下一秒就临近年尾。

但实际上这一年我们经历了太多,其中有恐慌、焦虑、辛酸和艰难,当然也有收获、快乐与感动。

回顾 2020 年,你最大的感受是什么?

作为一名开发者,你在 2020 又留下了哪些印记?

年底了,让我们一起回顾 2020,展望 2021,参加 SegmentFault 思否的年度有奖征文活动,来对自己的 2020年 做个总结吧~

如何参与?

一、活动规则

在思否社区写下你的「2020总结文章」,添加「2020总结」标签,并在文章注明超链接:

本文参与了 SegmentFault 思否征文「2020 总结」,欢迎正在阅读的你也加入。
二、文章内容

写下属于你的 2020 年 故事:标题不限,文体不限,语言不限,字数不限,自由发挥。

三、活动时间

自本篇文章发布始到 2021 年 1 月 31 日

有什么奖励 ?

image

实物奖品大合影

感谢融云RongCloud、青云QingCloud、京东智联云开发者社区、AWS、ARM中国 等对本次活动的赞助

编程课程8折劵(会在现有的折扣价上再打 8 折):

视频课程
图文课程

如何获奖?

当然,这些丰富礼品,要拿下以下这四个大奖才能得到~

  • 2020 人气顶流奖

    评选规则:社区文章互动数最多的(基于点赞、评论等)
    评选人数:【3人】
    💗奖励: 融云鼠标垫 + ARM 蓝牙音箱 + 京东玩偶 + 编程课程 8 折劵 各一份

  • 2020 凡尔赛文学奖

    评选规则:文笔超赞/分享硬核干货内容最多的
    评选人数:【3人】
    💗奖励: 青云定制包 + AWS 玩偶 + 技术书籍 + 编程课程 8 折劵 各一份

  • 2020 搞笑担当奖

    评选规则:内容最有趣的
    评选人数:【3人】
    💗奖励: 京东鼠标垫 + AWS 玩偶 + ARM 蓝牙音箱 + 编程课程 8 折劵 各一份

  • 2020 人间真爱奖

    评选规则:前【50人】(自本篇文章发布至1月31日)参与活动且文章符合要求被收录的征文作者即可获得奖励
    💗 奖励:1-20 可获得 SegmentFault 思否定制马克杯+ 编程课程 8 折劵, 21-50 可获得重启世界限量版手办 + 编程课程 8 折劵


2020 已经结束,2021 欣然赴约;凛冬过后,春天还会远吗?我们努力把 2021 过成梦想的样子...

温馨提示:

发布后在此帖下面留言,小姐姐会更快发现你的文章,获奖机会更大。
② 思否小姐姐会把优质文章汇总收录并发出,参与征文活动的优质文章内容会被推荐到社区首页技术交流群,分享给更多的开发者。
③ 除了以上的「四大奖」以外,还有神秘礼品,大家要积极参与哦~


扫码下方二维码,添加 SF 思否小姐姐 了解更多活动信息

思否小姐姐微信号

最终解释权归 SegmentFault 思否所有

参选文章汇总

  1. axuebin:一个小小前端的 2020 年流水账
  2. 欧雷属于我的三年·第一年
  3. Kevinwan一个20年技术老兵的 2020 年度技术总结
  4. 小傅哥2020总结 | 作为技术号主的一年!
  5. pingan87872020 总结 | 21 张图总结我的 2020 年
  6. 民工哥我的 2020 年是这样的。。你的呢?
  7. 沈唁今天,告别 2020 年。
  8. masonli“措手不及”的2020 | 2020总结
  9. 敲键盘的猫我的2020,在非常时期的非常努力
  10. 皮小蛋2020 年终总结
  11. Why技术2020,我这一年。
  12. xuexiangjys年终总结 | 在开源、博客和搬砖的路上砥砺前行「2020」
  13. codecraft2020年终总结
  14. 公丕昊再见,2020
  15. robin2020,再见
  16. 死月死月的二零二零总结
  17. linong2020总结😊我想混个奖品
  18. YourbatmanYourBatman 2020年感悟关键词:科比、裁员、管理层、活着
  19. 边城边城客栈的 2020
  20. Fw恶龙2020 年终盘点
  21. CrazyCodes2021 PHP程序员修炼秘籍
  22. 波波Nadia我的 2020 个人成长回顾:花足够长的时间,有智慧地做“无用功”
  23. 折腾不止的追梦人我的2020,啪啪打脸
  24. Kense2020 年终总结
  25. 一个优秀的废人来年,做个俗人!
  26. formulahendry我的 2020:出书、办签售会、发展 VS Code 中文社区、成为开源先锋、全网 10 万粉丝、10 场演讲、内推 21 人
  27. 程序员哆啦A梦2020回顾-个人web分享JavaScript面试题附加回答
  28. Shenfq:普普通通打工人的2020
  29. HLQ_Struggle静心,未来可期 | 告别 2020
  30. 蒋鹏飞工作都是公司的,技术才是自己的!| 底层技术人的2020年度总结
  31. Raymond懒人的2020
  32. xindooXINDOO的2020总结
  33. tina6662020 疫情下湖北人的生活(只谈生活)
  34. 张喜硕度光阴的人
  35. JerryWang_汪子熙一个SAP成都研究院开发工程师的2020年度总结:未知生,焉知死
  36. 夜尽天明前端工程师的 2020 年终总结 - 成长不及预期的 3 年之痒
  37. 张晋涛2020 小回顾 | 新晋程序员奶爸的云原生之路
  38. JamesGoodbye 2020 wassup 2021 | 2020 总结
  39. howie梦想开始的地方
  40. 运维汪回顾2020,展望202,确定三个关键字:自我成长、打地基、过男人关
  41. zangecizangeci的2020年度报告
  42. Meathill2020 年知识分享与学习总结
  43. 寒雁2021,一个长期主义者的年度计划
  44. 程序员cxuan:坚持并活下去!cxuan 在思否的 2020 年终总结。
  45. 芋头芒果小龙虾再见2020,再见口罩,再见所有的不愉快
  46. thinkwei全面建设小康社会的2020年
  47. Java中文社群大龄程序员10年编程生涯的转型之旅,2020年新的开始
  48. kumfo写在2020年结尾——2020总结
  49. qqxx6661阔别2020 | 我的年度总结
  50. 沉默王二2020总结文章|乘风破浪的一年
  51. joking_zhang2020 总结 | 张兜兜 - 神奇的一年
  52. Chor Chor 的 2020 年度总结 | 2020,再见;2021,你好
  53. 0xBoo二零二零年终总结
  54. 风中有php做的云洪光光的2020年
  55. 陆陆通通「2020总结」一个老程序员的 2020 年总结回顾,2021 年如何变的更牛逼
  56. By无邪2020年度总结
  57. 三掌柜2020年年度关于前端学习与工作的心得体会
  58. TianSong2020感谢每一天的陪伴
  59. Gopal:Gopal 的 2020 年度总结
  60. Mondo平凡的 2020 年
  61. 我是开发者FTD2020,再见;2021,我来了!
  62. 敖丙一年40W粉,小小程序员的2020年终总结
  63. 木易杨:我的 2020 总结,我在蚂蚁成长的这一年
  64. 蔚蓝2020 一个少年大厂梦的陨落与wlui的诞生
  65. 良许万万没想到,良许也开挂了
  66. mar112020年,得与失,汗水和泪水
  67. 依然饭特稀西2020年总结!翻过这座山,他们就会听到你的故事!
  68. 卡颂:大佬那么多,为什么不能是我 | 卡颂2020年终总结
  69. 起风了Zzzz24岁, 接触前端的这三年
  70. dreamapplehappy:2020年,我第一次很正式地写年终总结
  71. 书旅:2020年终总结:回顾、反思、期待
  72. phodal2020 结点:平凡 & 重新出发
  73. BWH_Steven二十一岁的九局下半,希望能将结局逆转 | 年度总结

划重点

不要忘记在你的文章下添加「2020总结」标签,并在文章末尾处注明超链接 ——

本文参与了 SegmentFault 思否征文「2020 总结」,欢迎正在阅读的你也加入。
查看原文

赞 25 收藏 3 评论 60

CrazyCodes 发布了文章 · 2020-12-19

API调试工具大汇总

image.png

前言

大家好,我是CrazyCodes,今天总结下业界常见的API调试工具,众所周知,API调试工具即简单化的完成API调试流程,将Header、Cookie等其他频繁使用的参数进行复用,对不计其数的接口进行分类,方便查询管理。

Postman

image.png

Postman是一款强大网页调试工具的客户端,你能想到的,Postman几乎都提供了。Postman兼容几乎所有的操作系统,并且提供了WEB版本,可以让你随时随地加班,不错吧。言归正传,先看下postman的控制面板
image.png
面板分为三部分

顶部

image.png

  • 创建面板
  • 批量导入接口,我们可以将同事的接口进行批量导入
  • 接口批量测试
  • 切换工作空间,与git概念相似,不同的工作区(分支),进行不同的工作
  • 同步、登录等等其他操作,postman有自己的云存储,注册账号可以将本机的调试接口同步到云上,这样就可以随时随地加班喽,不过免费用户是有存储上限的,具体请查看官网

左侧

image.png

  • 历史请求,会记录所有的请求调试
  • 接口集合目录,将接口合理分类,是提升工作效率的最佳实践

右侧

image.png

调试内容区,我们可以在这里进行任何方式的接口调试,请求方式支持rest风格,put,get,patch,post等等,并且可以设置认证方式,设置自定义的header头,设置前置脚本,后置脚本,并且设定了环境变量的功能,我们可以根据自己的开发、测试、生产地址,配置不同的链接,实现地址复用

postman应该是开发人员众所周知的最佳api调试工具了,postman不仅仅是一个调试工作,也配备了项目管理,协作办公等功能,不过好像是收费的,具体可以在官网查询,官网地址我贴在下面了

https://www.postman.com/

Swagger

image.png

Swagger是一款强大的api文档工具,其生成的文档具备调试功能,它可以通过读取注释的方式,自动生成对应的api文档,并且支持将文档导出成其他格式,简直不要太好,官网还特意开发了一项展示文档的ui页面,开源课随意修改的,其细节比较多,是基于编码层次的,就不细细讲解了。感兴趣的小伙伴可以点击下方链接

具体的玩法请见github https://github.com/swagger-api

PhpStorm Http Client

image.png

我是一名php程序员,所以就以phpstorm为例来讲解下,当然jetbrains内所有的产品都具备此项功能,PhpStorm 为接口调试提供了专属的工具,我们在菜单Tools->Http Client 可以找到它, jetbrains 提供的此项接口调试功能是专门为程序员准备的,没有任何界面,接口调试什么的全靠码,不过我们可以以git最简单的方式去维护接口文档。

httpclient 通过创建demo.http文件来进行调试的,http是文件后缀
image.png
上图是官方给到的demo,可以通过点击Run All Requests In File 对接口进行访问,也可以点击每个接口地址前方的箭头进行单个接口调试,整体来说还是比较方便的,接口的解释与正常代码注释一样

http client还支持将curl请求直接导入到http文件中
image.png

当然依旧支持环境变量,支持方式是由一个单独的json配置文件控制
image.png
点击后会自动在根目录创建配置文件

{
 "dev": {
 "url": "http://dev.baidu.com"
 },
 "pro": {
 "url": "http://pro.baidu.com"
 }
}

我们可以在http文件内通过{{url}}调用该变量,dev和pro分别代表不同的环境,我们可以在此处选择不同的环境
image.png

总体来说,简单简约,可扩展性强,感兴趣的小伙伴可以试试

ApiPost

image.png

apipost是国人开发的一款api调试工具,功能与postman类型,但是全部中文,其使用文档也非常详细
https://doc.apipost.cn/

冲着这句话,也得支持下,强烈推荐!
image.png
如果你英文不太好,使用apipost你会get到很多postman的丰富功能
image.png
其没有web版本,但有linux,mac,windows客户端,做纯工具的公司不多了,让我们守住他们。

Apizza

image.png

功能与apipost、postman相似,同一类产品,但只有web端,感兴趣的小伙伴可以点击下方链接进入

https://www.apizza.net/

看云文档

看云是thinkphp官网的文档管理工具,该文档内可以创建api调试
image.png

感兴趣的可以点击下方链接了解
https://www.kancloud.cn/

Teambition

一款协作项目管理工具,阿里巴巴搞的,该工作内文档功能可以创建api文档,可进行请求调试,感兴趣的可以点击下方链接

http://teambition.com/

致谢

工具永远只是工具,排序无好坏之分,我们按需使用。

感谢你看到这里,谢谢。

查看原文

赞 12 收藏 6 评论 2

CrazyCodes 回答了问题 · 2020-12-08

昆 明 办 假 护 照/签 证

耗子尾汁........

关注 4 回答 3

CrazyCodes 赞了文章 · 2020-11-18

一次MySQL两千万数据大表的优化过程,三种解决方案!

问题概述

使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死。严重影响业务。

问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视。原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!!

我尝试解决该问题,so,有个这个日志。

方案概述

方案一:优化现有mysql数据库。优点:不影响现有业务,源程序不需要修改代码,成本最低。缺点:有优化瓶颈,数据量过亿就玩完了。

方案二:升级数据库类型,换一种100%兼容mysql的数据库。优点:不影响现有业务,源程序不需要修改代码,你几乎不需要做任何操作就能提升数据库性能,缺点:多花钱

方案三:一步到位,大数据解决方案,更换newsql/nosql数据库。优点:扩展性强,成本低,没有数据容量瓶颈,缺点:需要修改源程序代码

以上三种方案,按顺序使用即可,数据量在亿级别一下的没必要换nosql,开发成本太高。三种方案我都试了一遍,而且都形成了落地解决方案。该过程心中慰问跑路的那几个开发者一万遍 :)

方案一详细说明:优化现有mysql数据库

跟阿里云数据库大佬电话沟通 and Google解决方案 and 问群里大佬,总结如下(都是精华):

  • 1.数据库设计和表创建时就要考虑性能
  • 2.sql的编写需要注意优化
  • 3.分区
  • 4.分表
  • 5.分库

1.数据库设计和表创建时就要考虑性能

mysql数据库本身高度灵活,造成性能不足,严重依赖开发人员能力。也就是说开发人员能力高,则mysql性能高。这也是很多关系型数据库的通病,所以公司的dba通常工资巨高。

设计表时要注意:

  • 1.表字段避免null值出现,null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null。
  • 2.尽量使用INT而非BIGINT,如果非负则加上UNSIGNED(这样数值容量会扩大一倍),当然能使用TINYINT、SMALLINT、MEDIUM_INT更好。
  • 3.使用枚举或整数代替字符串类型
  • 4.尽量使用TIMESTAMP而非DATETIME
  • 5.单表不要有太多字段,建议在20以内
  • 6.用整型来存IP

索引

  • 1.索引并不是越多越好,要根据查询有针对性的创建,考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描
  • 2.应尽量避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描
  • 3.值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段
  • 4.字符字段只建前缀索引
  • 5.字符字段最好不要做主键
  • 6.不用外键,由程序保证约束
  • 7.尽量不用UNIQUE,由程序保证约束
  • 8.使用多列索引时主意顺序和查询条件保持一致,同时删除不必要的单列索引

简言之就是使用合适的数据类型,选择合适的索引

选择合适的数据类型
(1)使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob
(2)使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数
(3)使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar
(4)尽可能使用not null定义字段
(5)尽量少用text,非用不可最好分表 # 选择合适的索引列
(1)查询频繁的列,在where,group by,order by,on从句中出现的列
(2)where条件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出现的列
(3)长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好
(4)离散度大(不同的值多)的列,放在联合索引前面。查看离散度,通过统计不同的列值来实现,count越大,离散程度越高:

原开发人员已经跑路,该表早已建立,我无法修改,故:该措辞无法执行,放弃!

2.sql的编写需要注意优化

1.使用limit对查询结果的记录进行限定

2.避免select *,将需要查找的字段列出来

3.使用连接(join)来代替子查询

4.拆分大的delete或insert语句

5.可通过开启慢查询日志来找出较慢的SQL

6.不做列运算:SELECT id WHERE age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函数、计算表达式等等,查询时要尽可能将操作移至等号右边

7.sql语句尽可能简单:一条sql只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大sql可以堵死整个库

8.OR改写成IN:OR的效率是n级别,IN的效率是log(n)级别,in的个数建议控制在200以内

9.不用函数和触发器,在应用程序实现

10.避免%xxx式查询

11.少用JOIN

12.使用同类型进行比较,比如用'123'和'123'比,123和123比

13.尽量避免在WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描

14.对于连续数值,使用BETWEEN不用IN:SELECT id FROM t WHERE num BETWEEN 1 AND 5

15.列表数据不要拿全表,要使用LIMIT来分页,每页数量也不要太大

原开发人员已经跑路,程序已经完成上线,我无法修改sql,故:该措辞无法执行,放弃!

引擎

目前广泛使用的是MyISAM和InnoDB两种引擎:

MyISAM

MyISAM引擎是MySQL 5.1及之前版本的默认引擎,它的特点是:

1.不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁

2.不支持事务

3.不支持外键

4.不支持崩溃后的安全恢复

5.在表有读取查询的同时,支持往表中插入新纪录

6.支持BLOB和TEXT的前500个字符索引,支持全文索引

7.支持延迟更新索引,极大提升写入性能

8.对于不会进行修改的表,支持压缩表,极大减少磁盘空间占用

InnoDB

InnoDB在MySQL 5.5后成为默认索引,它的特点是:

1.支持行锁,采用MVCC来支持高并发

2.支持事务

3.支持外键

4.支持崩溃后的安全恢复

5.不支持全文索引

总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表

MyISAM速度可能超快,占用存储空间也小,但是程序要求事务支持,故InnoDB是必须的,故该方案无法执行,放弃!

3.分区

MySQL在5.1版引入的分区是一种简单的水平拆分,用户需要在建表的时候加上分区参数,对应用是透明的无需修改代码

对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成,实现分区的代码实际上是通过对一组底层表的对象封装,但对SQL层来说是一个完全封装底层的黑盒子。MySQL实现分区的方式也意味着索引也是按照分区的子表定义,没有全局索引

用户的SQL语句是需要针对分区表做优化,SQL条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,可以通过EXPLAIN PARTITIONS来查看某条SQL语句会落在那些分区上,从而进行SQL优化,我测试,查询时不带分区条件的列,也会提高速度,故该措施值得一试。

分区的好处是:

1.可以让单表存储更多的数据

2.分区表的数据更容易维护,可以通过清楚整个分区批量删除大量数据,也可以增加新的分区来支持新插入的数据。另外,还可以对一个独立分区进行优化、检查、修复等操作

3.部分查询能够从查询条件确定只落在少数分区上,速度会很快

4.分区表的数据还可以分布在不同的物理设备上,从而搞笑利用多个硬件设备

5.可以使用分区表赖避免某些特殊瓶颈,例如InnoDB单个索引的互斥访问、ext3文件系统的inode锁竞争

6.可以备份和恢复单个分区

分区的限制和缺点:

1.一个表最多只能有1024个分区

2.如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来

3.分区表无法使用外键约束

4.NULL值会使分区过滤无效

5.所有分区必须使用相同的存储引擎

分区的类型:

1.RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区

2.LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择

3.HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式

4.KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值

5.具体关于mysql分区的概念请自行google或查询官方文档,我这里只是抛砖引玉了。

我首先根据月份把上网记录表RANGE分区了12份,查询效率提高6倍左右,效果不明显,故:换id为HASH分区,分了64个分区,查询速度提升显著。问题解决!

结果如下:PARTITION BY HASH (id)PARTITIONS 64

select count() from readroom_website; --11901336行记录

/ 受影响行数: 0 已找到记录: 1 警告: 0 持续时间 1 查询: 5.734 sec. /

select * from readroom_website where month(accesstime) =11 limit 10;

/ 受影响行数: 0 已找到记录: 10 警告: 0 持续时间 1 查询: 0.719 sec. */

4.分表

分表就是把一张大表,按照如上过程都优化了,还是查询卡死,那就把这个表分成多张表,把一次查询分成多次查询,然后把结果组合返回给用户。

分表分为垂直拆分和水平拆分,通常以某个字段做拆分项。比如以id字段拆分为100张表: 表名为 tableName_id%100

但:分表需要修改源程序代码,会给开发带来大量工作,极大的增加了开发成本,故:只适合在开发初期就考虑到了大量数据存在,做好了分表处理,不适合应用上线了再做修改,成本太高!!!而且选择这个方案,都不如选择我提供的第二第三个方案的成本低!故不建议采用。

5.分库

把一个数据库分成多个,建议做个读写分离就行了,真正的做分库也会带来大量的开发成本,得不偿失!不推荐使用。

方案二详细说明:升级数据库,换一个100%兼容mysql的数据库

mysql性能不行,那就换个。为保证源程序代码不修改,保证现有业务平稳迁移,故需要换一个100%兼容mysql的数据库。

开源选择

1.tiDB https://github.com/pingcap/tidb

2.Cubrid https://www.cubrid.org/

3.开源数据库会带来大量的运维成本且其工业品质和MySQL尚有差距,有很多坑要踩,如果你公司要求必须自建数据库,那么选择该类型产品。

云数据选择

1.阿里云POLARDB

2.https://www.aliyun.com/produc...

官方介绍语:POLARDB 是阿里云自研的下一代关系型分布式云原生数据库,100%兼容MySQL,存储容量最高可达 100T,性能最高提升至 MySQL 的 6 倍。POLARDB 既融合了商业数据库稳定、可靠、高性能的特征,又具有开源数据库简单、可扩展、持续迭代的优势,而成本只需商用数据库的 1/10。

我开通测试了一下,支持免费mysql的数据迁移,无操作成本,性能提升在10倍左右,价格跟rds相差不多,是个很好的备选解决方案!

1.阿里云OcenanBase

2.淘宝使用的,扛得住双十一,性能卓著,但是在公测中,我无法尝试,但值得期待

3.阿里云HybridDB for MySQL (原PetaData)

4.https://www.aliyun.com/produc...

官方介绍:云数据库HybridDB for MySQL (原名PetaData)是同时支持海量数据在线事务(OLTP)和在线分析(OLAP)的HTAP(Hybrid Transaction/Analytical Processing)关系型数据库。

我也测试了一下,是一个olap和oltp兼容的解决方案,但是价格太高,每小时高达10块钱,用来做存储太浪费了,适合存储和分析一起用的业务。

1.腾讯云DCDB

2.https://cloud.tencent.com/pro...

官方介绍:DCDB又名TDSQL,一种兼容MySQL协议和语法,支持自动水平拆分的高性能分布式数据库——即业务显示为完整的逻辑表,数据却均匀的拆分到多个分片中;每个分片默认采用主备架构,提供灾备、恢复、监控、不停机扩容等全套解决方案,适用于TB或PB级的海量数据场景。

腾讯的我不喜欢用,不多说。原因是出了问题找不到人,线上问题无法解决头疼!但是他价格便宜,适合超小公司,玩玩。

方案三详细说明:去掉mysql,换大数据引擎处理数据

数据量过亿了,没得选了,只能上大数据了。

开源解决方案

hadoop家族。hbase/hive怼上就是了。但是有很高的运维成本,一般公司是玩不起的,没十万投入是不会有很好的产出的!

云解决方案

这个就比较多了,也是一种未来趋势,大数据由专业的公司提供专业的服务,小公司或个人购买服务,大数据就像水/电等公共设施一样,存在于社会的方方面面。

国内做的最好的当属阿里云。

我选择了阿里云的MaxCompute配合DataWorks,使用超级舒服,按量付费,成本极低。

MaxCompute可以理解为开源的Hive,提供sql/mapreduce/ai算法/python脚本/shell脚本等方式操作数据,数据以表格的形式展现,以分布式方式存储,采用定时任务和批处理的方式处理数据。DataWorks提供了一种工作流的方式管理你的数据处理任务和调度监控。

当然你也可以选择阿里云hbase等其他产品,我这里主要是离线处理,故选择MaxCompute,基本都是图形界面操作,大概写了300行sql,费用不超过100块钱就解决了数据处理问题。

作者:王帅
来源地址:https://yq.aliyun.com/article...

image

查看原文

赞 23 收藏 19 评论 1

CrazyCodes 关注了用户 · 2020-11-10

我的内心毫无波动 @wodeneixinhaowubodong

关注 0

认证与成就

  • SegmentFault 讲师
  • 获得 5076 次点赞
  • 获得 40 枚徽章 获得 0 枚金徽章, 获得 11 枚银徽章, 获得 29 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

注册于 2015-08-21
个人主页被 27.9k 人浏览