暂时未有相关云产品技术能力~
暂无个人介绍
Redis是一个非关系型远程内存数据库,由于操作都在内存中,所以Redis的速度非常快,性能十分强劲。 它可以存储键和5种不同类型的值之间的映射。可以帮助用户解决各式各样的问题,直接将数据自然的映射到这5种数据结构。 通过复制、持久化和客户端分片功能,可以将Redis拓展成为一个包含数百GB的数据库,除非非常高的并发量。
服务器安装的是php7.2,就需要使用第一个命令php72w那个,具体使用什么命令,还需要按你自己的服务器PHP版本来看。安装后可用 which phpize 和 which php-config 查看安装的路径。
Centos的yum源中没有redis;这里我们需要安装一个第三方的yum源,这里用了Fedora的epel仓库。
Yarn是类似npm的另一种javascript包管理工具。 它的目的是解决使用 npm 时面临的少数问题,即: 1. 安装的时候无法保证速度/一致性 2. 安全问题,因为 npm 安装时允许运行代码
全文检索通过sphinx搜索出来的内容是没有问题的。这里使用了PHP内置的similar_text函数对文章的描述以及标题进行相似度的计算,然后根据计算之后的相似度数值进行倒叙排序。
主索引的更新频率可以设置的长一些(例如设置在每天的凌晨进行),而增量索引的更新频率,我们可以将时间设置的很短(几分钟左右),这样在用户搜索的时候,我们可以同时查询这两个索引的数据。 使用“主索引+增量索引”方法有个简单的实现,在数据库中增加一个计数表,记录每次重新构建主索引时,被索引表的最后一个数据id,这样在增量索引时只需要索引这个id以后的数据即可,每次重新构建主索引时都更新这个表。
source:数据源,数据是从什么地方来的。 index:索引,当有数据源之后,从数据源处构建索引。索引实际上就是相当于一个字典检索。有了整本字典内容以后,才会有字典检索。 searchd:提供搜索查询服务。它一般是以deamon的形式运行在后台的。 indexer:构建索引的服务。当要重新构建索引的时候,就是调用indexer这个命令。
Sphinx匹配模式 语法: $sp -> SetMatchMode(常量) SPH_MATCH_ALL 匹配所有词(默认) SPH_MATCH_ANY 匹配一个词 SPH_MATCH_PHRASE 匹配整一个词 SPH_MATCH_BOOLEAN 将查询看作一个布尔表达式 SPH_MATCH_EXTENDED 查询看做一个sphinx的表达式
选择在更新数据的时候更新索引,这样做是为了保证数据检索的实时性,但是如果您的数据需要比较频繁的更新且数据量比较大,并且对数据检索没有实时性的要求,那么可以使用linux的定时任务,在使用人数较少的时候来更新索引,
Sphinx3.3.1版本是不需要编译安装的,下载下来,解压,直接就能用。 这个和我目前正在使用的sphinx-for-chinese 是有不同的。
Coreseek目前官方网站已经不能访问了,大概率估计后期就不会有人维护了。对于长期发展来看,可能是不要好。 所以我的博客中使用了sphinx-for-chinese。是基于sphinx2.3.1开发的。 下载地址:gitee.com/mz/sphinx
sphinx是不支持中文分词的,所以,百度上给的大多数的结果是基于sphinx内核开发的coreseek+mmseg分词的一套组合来实现中文分词+全文检索。
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用 程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL 也设计了一个存储引擎插件。
索引合并是mysql底层为我们提供的智能算法。了解索引合并的算法,有助于我们更好的创建索引。 索引合并是通过多个range类型的扫描并且合并它们的结果集来检索行的。仅合并来自单个表的索引扫描,而不是跨多个表的索引扫描。合并会产生底层扫描的三种形式:unions(合并)、intersections(交集)、unions-of-intersections(先取交集再合并)。
全文索引(FULLTEXT ):可用于 MyISAM 表,mysql5.6之后也可用于innodb表, 用于在一篇文章中,检索文本信息的, 针对较大的数据,生成全文索引很耗时和空间。
唯一索引(UNIQUE):与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引(PRIMARY):它是一种特殊的唯一索引,不允许有空值。 主键索引,简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录。一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL。
联合(组合)索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。
我们常用的索引数据结构比较多的是B+TREE。 还有另一种索引数据结构是hash,但是innoDB、mysiam数据引擎不支持hash数据结构。
Mysql中常用的两个存储引擎innodb和mysiam的索引是不同的。 聚集索引就是以主键创建的索引 非聚集索引就是除了主键以外的索引。非聚集索引也叫做二级索引,不用纠结那么多名词,将其等价就行了。非聚集索引在建立的时候也未必是单列的,可以多个列来创建索引。
索引本质上是一种数据结构,让我们在查询数据的时候尽量减少磁盘I/O。 前边大概看了索引的原理。数据库的复杂性,以及读取磁盘时,磁盘I/O等。任何一种数据结构都不是凭空产生的,一定会有它的背景和使用场景,我们现在总结一下,我们需要这种数据结构能够做些什么,其实很简单,那就是:每次查找数据时把磁盘IO次数控制在一个很小的数量级,最好是常数数量级。
索引在MySQL中也叫做“键”或者"key"(primary key,unique key,还有一个index key),是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要,减少io次数,加速查询。 索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。 索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。
抽象工厂模式:提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们具体的类。
观察者模式(Observer Pattern)是设计模式中行为模式的一种,它解决了上述具有一对多依赖关系的对象的重用问题。此模式的参与者分为两大类,一类是被观察的目标,另一类是观察该目标的观察者们。 正因为该模式是基于“一对多”的关系,所以该模式一般是应用于由一个目标对象和N个观察者对象组成(当然也可以扩展为有多个目标对象,但我们现在只讨论前者)的场合。 当目标对象的状态发生改变或做出某种行为时,正在观察该目标对象的观察者们将自动地、连锁地作出相应的响应行为。
建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。
迪米特(最少知识)法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
工厂模式:定义一个用于创建对象的接口,让子类来决定实例化哪一个类,工厂方法使一个类的实例化延迟到子类。
代理模式:为其他对象提供一种代理以控制对这个对象的访问。 其通用设计图如下图所示:精髓是RealSubject类和Proxy类都实现Subject,使用Proxy类来限制对RealSubject类的访问
装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。 四个主要角色分别为: 抽象构件(Component)角色:给出一个抽象接口,以规范准备接受附加责任的对象。 具体构件(ConCreteComponent)角色:定义一个将要接受附加责任的类。 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。 具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。
里氏替换原则,为继承定义规范。 里氏替换原则有如下特点:代码共享,减少创建类的工作量、提高代码的重用性、提高代码的可扩展性、提高产品代码的开放性、继承侵入性 只要继承,必须拥有父类的内容、降低代码的灵活性,子类必须拥有父类的属性和方法、增强耦合性。
依赖倒置原则的包含如下的三层含义:高层模块不应该依赖低层模块,两者都应该依赖其抽象、 抽象不应该依赖细节、 细节应该依赖抽象。
开放封闭原则:软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改。 也就是如果需求发生变化导致程序中多个依赖模块都发生了级联的改动,就说明这个程序是有问题的,程序变得相对脆弱、无法重用。开放封闭原则就相对的解决了这个问题,它强调的是你设计的模块应该从不改变(绝对不改变是不可能的,只能相对少改动)。当需求变化时,你可以通过添加新的代码来扩展这个模块的行为,而不去更改那些已经存在的可以工作的代码。
单一职责原则:官方给的说法是,就一个类而言,应该仅有一个因其他变化的原因。 说白了就是,一个类只负责一项职责。 最简单也是最难的原则。难处在于对职责进行划分。单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计得是否优良,但是“职责”和“变化原因”都是不可度量的,因项目而异,因环境而异。 软件设计真正要做的内容,就是发现职责并把那些职责互相分离。单一职责原则可以使类的复杂度降低,实现什么职责都有清晰明确的定义;类的可读性提高,复杂度降低;可读性提高了,代码就更容易维护;变更(需求是肯定会变)引起的风险(包括测试的难度,以及需要测试的范围)降低。
应用场景:当你不确定,有多少种操作的时候,例如:计算器中的 + - * / 我们可以使用简单工厂模式。 我们就以上边说过的加减乘除运算举例:建立一个控制台应用,输入两个数字和一个运算符,得到结果。
我这里计划做一个即时聊天的小功能,计划是在一个抽屉组件中实现这个功能。
上一篇中介绍了如何使用onclick为动态添加的dom元素绑定事件。 我现在就可以自定义大图组件了。 为ueditor编辑的html添加onclick这个步骤,我是在后端做的,后端返回到前端的值,就是已经拼装好的html。
怎么在页面加载完成之后给html绑定事件呢? Jquery有$.on方法,但是,我不想再vue里边使用jquery。 哎呀,迷糊了,原生javascript有onclick呀。
项目中需要使用到文件上传。我这里自己定义了一个上传文件的组件 支持显示上传进度显示(我这里显示的是真实的上传进度,当然,这个可以根据你自己的需求修改)。 支持多文件上传。
项目中需要使用到wangeditor,这里封装一个自定义组件,便于后期使用。 首先,官方文档: www.wangeditor.com/
接着自定义组件,这里是我自定义的一个modal对话框组件。
这里自定义了几个alert弹窗组件:带有确定取消的alert弹窗组件、自定义alert,在自定义时间消失(仿layer)、自定义loading,在需要让他消失的时候让其消失 。
刚开始使用vue3写博客的时候,其相关配套的UI库并没有正式发布,但是我还要用,所以这里我自定义了一个分页组件。
懒加载简单来说就是延迟加载或按需加载,即在需要的时候的时候进行加载。 常用的懒加载方式有两种:即使用vue异步组件 和 ES中的import
新窗口打开标签页这个功能在html中还是很简单的。添加Target=”__blank”就好。
VUE不仅为我们提供了自定义组件,还提供了自定义指令。当然,这个玩意我在VUE2中是没有用到过的。 VUE3中我大概试一下这个自定义指令: 官方文档: vue3js.cn/docs/zh/gui…
压缩可以减小HTTP回复的大小,从而降低web服务器的响应时间。gzip是web服务器广泛使用的压缩工具,可以将HTTP回复的大小降低到原来的50%~30%。既提高了网页的加载速度,又可以节约服务器流量。 nginx在设置了gzip on 后就已经打开了gzip压缩功能,不过这时候nginx所使用的是动态压缩。在动态压缩的情况下nginx会自动的将文件压缩成.gz文件,这时候就算不配置vue也能达到一样的效果。
这部分内容比较少。其实更多的是参考一下vue-router4的官方文档就好。 但是,去掉#之后的路由在配合php框架使用的时候可能会有问题,就是这个链接不知道该去后端还是去前端的路由。
之前在使用VUE2的时候有用到VUEX状态管理系统。 我用的比较多的地方是子父组件传值,或者爷孙组件传值。就是共享状态。 VUEX在我这里的作用主要还是为了简化组件中的代码的复杂度。所用的值使用VUEX统一管理,对后期的维护以及扩展性都有很大的帮助。