- 博客(58)
- 资源 (5)
- 收藏
- 关注
原创 GitLab环境搭建
你可以通过OpenSSL或其他工具生成自签名的证书,或者使用来自证书颁发机构(CA)的证书。最后,通过HTTPS URL访问你的GitLab实例,确保一切正常工作。首先,需要停止正在运行的GitLab容器,以确保在迁移过程中数据的一致性。在确认新位置的数据一切正常后,可以安全地删除旧的数据目录,以释放磁盘空间。注意:在Docker中,你可能需要将证书和私钥文件挂载到容器中,或者将它们复制到容器内的适当位置。注意:在实际生产环境中,建议使用来自CA的证书,以确保安全性。
2024-08-13 11:26:19
709
原创 ES-ES的基本概念
分片可以是主分片(primary shard)或者是复制分片(replica shard),主分片用于存储实际数据,而复制分片则是主分片的副本,用于提高数据的可靠性和可用性。在了解倒排索引之前我们先讲解一下什么是正排索引,正排索引就是根据ID查询具体的数据,可以类比于一本书的目录,我们可以快速的根据目录中的页码快速找到对应的内容,而假如现在我们有一个关键词,需要知道关键词所在页码,那么就需要一个关键词和页码的一个索引来帮助我们根据关键词找到对应的页码,这个索引就叫做倒排索引。主要用于对数据进行预处理。
2024-02-27 13:47:49
1356
原创 算法与数据结构-回溯算法
每个阶段,我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路口,另选一种走法继续走。实际上,背包问题我们在贪心算法那一节,已经讲过一个了,不过那里讲的物品是可以分割的,我可以装某个物品的一部分到背包里面。如果遇到特殊字符的时候,我们就有多种处理方式了,也就是所谓的岔路口,比如“*”有多种匹配方案,可以匹配任意个文本串中的字符,我们就先随意的选择一种匹配方案,然后继续考察剩下的字符。在放置的过程中,我们不停地检查当前的方法,是否满足要求;
2023-11-01 09:07:04
359
原创 算法与数据结构-分治算法
分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。这个定义看起来有点类似递归的定义。关于分治和递归的区别,分治算法是一种处理问题的思想,递归是一种编程技巧。实际上,分治算法一般都比较适合用递归来实现。分解:将原问题分解成一系列子问题;解决:递归地求解各个子问题,若子问题足够小,则直接求解;合并:将子问题的结果合并成原问题。
2023-11-01 08:55:19
274
原创 算法与数据结构-贪心算法
关于贪心算法,我们先看一个例子。假设我们有一个可以容纳 100kg 物品的背包,可以装各种物品。我们有以下 5 种豆子,每种豆子的总量和总价值都各不相同。为了让背包中所装物品的总价值最大,我们如何选择在背包中装哪些豆子?每种豆子又该装多少呢?实际上,这个问题很简单,我估计你一下子就能想出来,没错,我们只要先算一算每个物品的单价,按照单价由高到低依次来装就好了。单价从高到低排列,依次是:黑豆、绿豆、红豆、青豆、黄豆,所以,我们可以往背包里装 20kg 黑豆、30kg 绿豆、50kg 红豆。
2023-10-24 15:43:42
371
原创 算法与数据结构-AC自动机
单模式串匹配算法,是在一个模式串和一个主串之间进行匹配,也就是说,在一个主串中查找一个模式串。多模式串匹配算法,就是在多个模式串和一个主串之间做匹配,也就是说,在一个主串中查找多个模式串。尽管,单模式串匹配算法也能完成多模式串的匹配工作。例如开篇的思考题,我们可以针对每个敏感词,通过单模式串匹配算法(比如 KMP 算法)与用户输入的文字内容进行匹配。但是,这样做的话,每个匹配过程都需要扫描一遍用户输入的内容。整个过程下来就要扫描很多遍用户输入的内容。
2023-09-28 08:44:36
268
原创 算法与数据结构-Trie树
Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。当然,这样一个问题可以有多种解决方法,比如散列表、红黑树,或者我们前面几节讲到的一些字符串匹配算法,但是,Trie 树在这个问题的解决上,有它特有的优点。不仅如此,Trie 树能解决的问题也不限于此,我们一会儿慢慢分析。现在,我们先来看下,Trie 树到底长什么样子。我举个简单的例子来说明一下。
2023-09-27 14:00:46
348
1
原创 算法与数据结构-字符串匹配算法
这里面 bc 是好后缀,尽管在模式串中没有另外一个相匹配的子串{u*},但是如果我们将模式串移动到好后缀的后面,如图所示,那就会错过模式串和主串可以匹配的情况。从这里例子中,我们很容易就能得出这样的规律:相邻两个子串 s[i-1]和 s[i](i 表示子串在主串中的起始位置,子串的长度都为 m),对应的哈希值计算公式有交集,也就是说,我们可以使用 s[i-1]的哈希值很快的计算出 s[i]的哈希值。前面两节讲的算法,在匹配的过程中,我们都是按模式串的下标从小到大的顺序,依次与主串中的字符进行匹配的。
2023-09-26 10:03:38
308
1
原创 算法与数据结构-堆
堆是一个完全二叉树;堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。我分别解释一下这两点。第一点,堆必须是一个完全二叉树。还记得我们之前讲的完全二叉树的定义吗?完全二叉树要求,除了最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列。第二点,堆中的每个节点的值必须大于等于(或者小于等于)其子树中每个节点的值。实际上,我们还可以换一种说法,堆中每个节点的值都大于等于(或者小于等于)其左右子节点的值。这两种表述是等价的。
2023-09-25 15:55:10
332
1
原创 算法与数据结构-图
图(Graph)和树比起来,这是一种更加复杂的非线性表结构。前面我们分析了,微博、微信是两种“图”,前者是有向图,后者是无向图。在这个问题上,两者的解决思路差不多,所以我只拿微博来讲解。数据结构是为算法服务的,所以具体选择哪种存储方法,与期望支持的操作有关系。判断用户 A 是否关注了用户 B;判断用户 A 是否是用户 B 的粉丝;用户 A 关注用户 B;用户 A 取消关注用户 B;根据用户名称的首字母排序,分页获取用户的粉丝列表;根据用户名称的首字母排序,分页获取用户的关注列表。
2023-09-06 14:25:49
134
原创 算法与数据结构-二叉树
树”这种数据结构真的很像我们现实生活中的“树”,这里面每个元素我们叫做“节点”;用来连接相邻节点之间的关系,我们叫做“父子关系”。比如下面这幅图,A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫做根节点,也就是图中的节点 E。我们把没有子节点的节点叫做叶子节点或者叶节点,比如图中的 G、H、I、J、K、L 都是叶子节点。
2023-08-22 09:08:24
295
原创 响应式编程
响应式编程打破了传统的同步阻塞式编程模型,基于响应式数据流和背压机制实现了异步非阻塞式的网络通信、数据访问和事件驱动架构,能够减轻服务器资源之间的竞争关系,从而提高服务的响应能力。
2023-08-22 08:47:51
996
原创 算法与数据结构-哈希算法
哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同;散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。
2023-08-15 10:56:52
393
原创 算法与数据结构-散列表
散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。我用一个例子来解释一下。假如我们有 89 名选手参加学校运动会。为了方便记录成绩,每个选手胸前都会贴上自己的参赛号码,用 6 位数字来表示,比如 051167,其中,前两位 05 表示年级,中间两位 11 表示班级,最后两位还是原来的编号 1 到 89。现在我们希望编程实现这样一个功能,通过编号快速找到对应的选手信息。你会怎么做呢?
2023-08-07 10:29:12
566
原创 算法与数据结构-跳表
对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是 O(n)。那怎么来提高查找效率呢?如果像图中那样,对链表建立一级“索引”,查找起来是不是就会更快一些呢?每两个结点提取一个结点到上一级,我们把抽出来的那一级叫做索引或索引层。你可以看我画的图。图中的 down 表示 down 指针,指向下一级结点。如果我们现在要查找某个结点,比如 16。
2023-08-04 17:55:22
946
2
原创 算法与数据结构-二分查找
二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。我们来举个例子,假设只有 10 个订单,订单金额分别是:8,11,19,23,27,33,45,55,67,98。现在要查找金额为19的订单是否存在,利用二分思想,每次都与区间的中间数据比对大小,缩小查找区间的范围。为了更加直观,我画了一张查找过程的图。
2023-07-28 09:19:15
527
原创 算法与数据结构-排序
换句话说,平均情况下,需要 n*(n-1)/4 次交换操作,比较操作肯定要比交换操作多,而复杂度的上限是 O(n²),所以平均情况下的时间复杂度就是 O(n²)。为了保证冒泡排序算法的稳定性,当有相邻的两个元素大小相等的时候,我们不做交换,相同大小的数据在排序前后不会改变顺序,所以冒泡排序是稳定的排序算法。从我们的原理分析和代码可以看出,归并排序的执行效率与要排序的原始数组的有序程度无关,所以其时间复杂度是非常稳定的,不管是最好情况、最坏情况,还是平均情况,时间复杂度都是 O(nlogn)。
2023-07-19 17:14:40
1021
原创 算法与数据结构-递归
递归是一种直接或者间接调用自身函数或者方法的算法(或者编程技巧),应用非常广泛。我们举个例子来说明什么是递归:推荐注册返佣金的这个功能我想你应该不陌生吧?现在很多 App 都有这个功能。这个功能中,用户 A 推荐用户 B 来注册,用户 B 又推荐了用户 C 来注册。我们可以说,用户 C 的“最终推荐人”为用户 A,用户 B 的“最终推荐人”也为用户 A,而用户 A 没有“最终推荐人”。一般来说,我们会通过数据库来记录这种推荐关系。
2023-07-06 17:01:18
503
原创 算法与数据结构-队列
队列跟栈一样,也是一种操作受限的线性表数据结构。不过,队列是先进者先出。队列最大的特点就是先进先出,主要的两个操作是入队和出队。跟栈一样,它既可以用数组来实现,也可以用链表来实现。用数组实现的叫顺序队列,用链表实现的叫链式队列。特别是长得像一个环的循环队列。在数组实现队列的时候,会有数据搬移操作,要想解决数据搬移的问题,我们就需要像环一样的循环队列。
2023-07-06 10:43:41
442
原创 算法与数据结构-栈
后进者先出,先进者后出,这就是典型的“栈”结构。就像一摞叠在一起的盘子。我们平时放盘子的时候,都是从下往上一个一个放;取的时候,我们也是从上往下一个一个地依次取,不能从中间任意抽出。从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。栈是一种操作受限的数据结构,只支持入栈和出栈操作。后进先出是它最大的特点。栈既可以通过数组实现,也可以通过链表来实现。不管基于数组还是链表,入栈、出栈的时间复杂度都为 O(1)。
2023-07-05 14:03:11
338
原创 算法与数据结构-链表
数组和链表是两种截然不同的内存组织方式。正是因为内存存储的区别,它们插入、删除、随机访问操作的时间复杂度正好相反。不过,数组和链表的对比,并不能局限于时间复杂度。而且,在实际的软件开发中,不能仅仅利用复杂度分析就决定使用哪个数据结构来存储数据。数组简单易用,在实现上使用的是连续的内存空间,可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。而链表在内存中并不是连续存储,所以对 CPU 缓存不友好,没办法有效预读。数组的缺点是大小固定,一经声明就要占用整块连续内存空间。
2023-06-30 14:07:19
424
原创 算法与数据结构-数组
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。这个定义里有几个关键词,理解了这几个关键词,我想你就能彻底掌握数组的概念了。
2023-06-08 15:30:08
598
原创 Spring-Bean基础
BeanDefinition 是 Spring Framework 中定义 Bean 的配置元信息接口,包含如下信息:我们直接给出代码示例:
2023-06-08 14:03:49
393
原创 算法与数据结构-复杂度分析
算法的执行效率,粗略地讲,就是算法代码执行的时间。但是,如何在不运行代码的情况下,用“肉眼”得到一段代码的执行时间呢?这里有段非常简单的代码,求 1,2,3…n 的累加和。现在,我就带你一块来估算一下这段代码的执行时间。int i = 1;for(;i
2023-05-29 16:26:42
1057
原创 Spring-重新认识IoC二
因此,可以说 ApplicationContext 是 Spring IoC 容器的“超集”,提供了更多的功能和更完整的支持。在实际应用中,可以根据具体的需求选择使用 BeanFactory 还是 ApplicationContext。
2023-05-23 15:30:05
629
原创 Spring-重新认识IoC一
控制反转,将对象创建、配置和管理的责任从应用程序代码中转移到了Spring容器。通过使用IoC,应用程序不再负责创建和管理对象,而是由Spring容器负责这些任务。这样可以减少代码中的硬编码依赖关系,提高代码的灵活性和可维护性。
2023-05-22 17:43:24
447
原创 Spring-与JavaEE的整合
文章目录Web存储Bean管理资源相关Web存储Bean管理资源相关JSR 官方网址:https://jcp.org/小马哥 JSR 收藏:https://github.com/mercyblitz/jsrSpring 官方文档根路径:https://docs.spring.io/spring/docs/
2023-05-15 18:11:04
87
原创 Spring-重识Spring
Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架。Spring是一个开源容器框架,它集成各类型的工具,通过核心的Bean factory实现了底层的类的实例化和生命周期的管理。在整个框架中,各类型的功能被抽象成一个个的 Bean,这样就可以实现各种功能的管理,包括动态加载和切面编程。
2023-05-15 18:03:11
432
原创 设计模式-备忘录模式
在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。在我看来,这个模式的定义主要表达了两部分内容。一部分是,存储副本以便后期恢复。这一部分很好理解。另一部分是,要在不违背封装原则的前提下,进行对象的备份和恢复。前面我们只是简单介绍了备忘录模式的原理和经典实现,现在我们再继续深挖一下。如果要备份的对象数据比较大,备份频率又比较高,那快照占用的内存会比较大,备份和恢复的耗时会比较长。这个问题该如何解决呢?不同的应用场景下有不同的解决方法。
2023-05-15 17:04:39
351
原创 设计模式-迭代器模式
迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。它用来遍历集合对象。这里说的“集合对象”也可以叫“容器”“聚合对象”,实际上就是包含一组对象的对象,比如数组、链表、树、图、跳表。迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。迭代器模式用来遍历集合对象。不过,很多编程语言都将迭代器作为一个基础的类库,直接提供出来了。在平时开发中,特别是业务开发,我们直接使用即可,很少会自己去实现一个迭代器。
2023-05-15 16:17:11
550
原创 设计模式-状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。实际上,像游戏这种比较复杂的状态机,包含的状态比较多,我优先推荐使用查表法,而状态模式会引入非常多的状态类,会导致代码比较难维护。
2023-05-15 15:58:00
547
原创 设计模式-职责链模式
将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。这么说比较抽象,我用更加容易理解的话来进一步解读一下。在职责链模式中,多个处理器(也就是刚刚定义中说的“接收对象”)依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式。
2023-05-15 10:05:55
343
原创 设计模式-策略模式
定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)策略类的定义比较简单,包含一个策略接口和一组实现这个接口的策略类。因为所有的策略类都实现相同的接口,所以,客户端代码基于接口而非实现编程,可以灵活地替换不同的策略。//具体的算法... } } public class ConcreteStrategyB implements Strategy {//具体的算法... } }策略模式用来解耦策略的定义、创建、使用。
2023-05-12 09:17:50
431
原创 设计模式-模板模式
模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。这里的“算法”,我们可以理解为广义上的“业务逻辑”,并不特指数据结构和算法中的“算法”。这里的算法骨架就是“模板”,包含算法骨架的方法就是“模板方法”,这也是模板方法模式名字的由来。模板模式的用法和应用场景比较简单,我们在项目中应该比较常用,需要注意的是模板方法尽量使用final修饰避免子类重写导致模板失效。
2023-05-11 21:01:32
150
原创 设计模式-观察者模式
在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。不过,在实际的项目开发中,这两种对象的称呼是比较灵活的,有各种不同的叫法,比如:Subject-Observer、Publisher-Subscriber、Producer-Consumer、EventEmitter-EventListener、Dispatcher-Listener。
2023-05-06 17:36:12
672
原创 设计模式-享元模式
所谓“享元”,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。需要注意的是,享元模式对 JVM 的垃圾回收并不友好。因为享元工厂类一直保存了对享元对象的引用,这就导致享元对象在没有任何代码使用的情况下,也并不会被 JVM 垃圾回收机制自动回收掉。因此,在某些情况下,如果对象的生命周期很短,也不会被密集使用,利用享元模式反倒可能会浪费更多的内存。
2023-05-04 15:49:36
106
原创 设计模式-组合模式
将一组对象组织(Compose)成树形结构,以表示一种“部分 - 整体”的层次结构。组合让客户端(在很多设计模式书籍中,“客户端”代指代码的使用者。)可以统一单个对象和组合对象的处理逻辑。组合模式的设计思路,与其说是一种设计模式,倒不如说是对业务场景的一种数据结构和算法的抽象。其中,数据可以表示成树这种数据结构,业务需求可以通过在树上的递归遍历算法来实现。
2023-05-04 11:02:10
495
原创 设计模式-门面模式
门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。注意这里针对的是接口。这个定义很简洁,我再进一步解释一下。假设有一个系统 A,提供了 a、b、c、d 四个接口。系统 B 完成某个业务功能,需要调用 A 系统的 a、b、d 接口。利用门面模式,我们提供一个包裹 a、b、d 接口调用的门面接口 x,给系统 B 直接使用。不知道你会不会有这样的疑问,让系统 B 直接调用 a、b、d 感觉没有太大问题呀,为什么还要提供一个包裹 a、b、d 的接口 x 呢?
2023-04-28 11:11:35
823
原创 设计模式-适配器模式
适配器模式的英文翻译是 Adapter Design Pattern。顾名思义,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。对于这个模式,有一个经常被拿来解释它的例子,就是 USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。一般来说,适配器模式可以看作一种“补偿模式”,用来补救设计上的缺陷。应用这种模式算是“无奈之举”,如果在设计初期,我们就能协调规避接口不兼容的问题,那这种模式就没有应用的机会了。
2023-04-28 09:37:51
748
ES安装包适用于x86-64架构下的Linux操作系统
2024-01-22
Grafana 是一款开源的数据可视化和监控工具 它可以查询和可视化来自多个数据源的指标,并创建精美的dashboards
2023-05-30
监控工具Prometheus安装包,支持x86架构的Linux系统
2023-05-30
64位JDK1.6安装版+64位JDK1.6免安装版+64位JDK1.8安装版+32位JDK1.8免安装版
2021-06-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人