自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(91)
  • 收藏
  • 关注

原创 初识ES(ES的基本概念、倒排索引、索引和文档的CRUD)

倒排索引中有两个非常重要的概念:文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。如:小米发布会开始。可以分词为:小米,发布会,发布,开始这几个词条。

2024-04-07 11:24:22 714

原创 计网:HTTPS协议详解

通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到一个 Hash 值 H2;接下来,客户端与服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过用「会话秘钥」加密内容。客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性。上面第一项的随机数是整个握手阶段的第三个随机数,会发给服务端,所以这个随机数客户端和服务端都是一样的。

2024-03-07 17:49:49 924

原创 MySQL:索引的优化方法

当字段是类似于男/女这种的就没必要创建索引了,因为这样查询索引还是会查询到很多数据,没有给我们提升什么效率,而且MySQL 还有一个查询优化器,查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。当字段经常更新时也最好不要建立索引,因为随着数据的更新,为了维护B+树的有序性,B+树也要进行更新调整,经常性的更新太浪费数据库性能了。如果经常再查询语句中经常用不到的字段也不要创建索引了,反而浪费。数据库数据少的时候也不用创建

2024-03-02 11:23:13 1026

原创 MySQL:一行记录如何

所以在设计数据库表的时候,通常都是建议将字段设置为 NOT NULL,这样可以至少节省 1 字节的空间(NULL 值列表至少占用 1 字节空间)。【举例】以上面表举例:第一条记录:但是 InnoDB 是用整数字节的二进制位来表示 NULL 值列表的,现在不足 8 位,所以要在高位补 0,最终用二进制来表示:第二条记录:第三条记录 phone 列 和 age 列是 NULL 值,所以,对于第三条数据,NULL 值列表用十六进制表示是 0x06。

2024-03-01 09:32:30 982

原创 MySQL:索引有哪些(清晰明了)

2.1聚簇索引:主键索引的 B+Tree 的叶子节点存放的是实际数据,所有完整的用户记录都存放在主键索引的 B+Tree 的叶子节点里,当通过聚簇索引查询的时候,不需要回表,因为这个索引中存储了这张表中所有数据。聚簇索引的创建:如果有主键,默认会使用主键作为聚簇索引的索引键(key);如果没有主键,就选择第一个不包含 NULL 值的唯一列作为聚簇索引的索引键(key);在上面两个都没有的情况下,InnoDB 将自动生成一个隐式自增 id 列作为聚簇索引的索引

2024-02-29 21:51:38 1161

原创 力扣区间题:合并区间、插入区间

这个有两种解法,一种就是直接将这个要插入的区间加入数组,让合并区间的算法走一遍,就可以了。我们可以将区间按照左端点升序排列,然后遍历区间进行合并操作。遍历结束,如果新区间还没有被加入,那么将新区间加入到答案中。

2024-02-29 20:32:28 470

原创 MySQL:数据库中有哪些锁

表锁是一种粗粒度的锁,它会锁定整个表,除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。表锁适用于特定的场景,但通常不推荐使用,因为它会影响并发性能。2.2意向锁意向锁是一种表级锁,用于指示其他事务是否已经持有了行级锁或表级锁。意向锁不会阻塞其他事务,只是作为一种标记。什么时候加意向锁:在获取行级锁之前,在获取表级锁之前都需要先加上意向锁。意向锁的存在表示其他事务可能已经在该表上加了表锁/行级锁,因此事务在获取表级锁/行锁之前需要先检查意向锁。意向锁的目的是为了快速

2024-02-29 16:35:25 1297

原创 MySQL:快照读和当前读

在读取数据时直接读取数据库中的最新版本,即读取的是已经提交的事务所修改的数据。当前读操作会获取共享锁,阻塞其他事务对该数据的写操作,以保证读取到的数据是最新的。这对于需要读取最新数据的场景非常重要,例如查询实时数据或进行数据分析。SELECT … LOCK IN SHARE MODE (共享读锁):使用共享读锁时,其他事务可以同时读取相同的数据,但不能修改它。适用于需要读取数据的场景,但不希望其他事务修改该数据。SELECT … FOR UPDATE:使用排他锁时,其他事务无法同时读取或修改

2024-02-29 14:16:40 1220 1

原创 浅谈加密算法(对称加密、非对称加密、混合加密、数字签名、哈希函数)

对称加密只有,直接使用这一个密钥对信息进行加密或解密。这样子就使得对称加密解密十分高效,计算量也相较于非对称加密小很多,适合有大量数据的场合。密钥只有一个且他一定不能泄漏。由此分发密钥,讲这个密钥传递给客户端是一件很有挑战性的事情。所以相较于,对称加密的安全性低一些,因为再传递过程中密钥可能被他人获取。

2024-02-21 21:43:53 1048

原创 Java线程池知识点总结

上面的代码我们设置最大线程数量为6,而阻塞队列可以排三个,说明当同时有超过9个任务需要执行,第10个线程就会执行拒绝策略,我设置的策略为丢弃任务,并抛出异常RejectedExecutionException。下面有结果就可以证明我们的猜测。74行恰好是我们放入线程池中第10个任务,所以第74行抛出了RejectedExecutionException异常。

2024-02-21 14:42:59 901

原创 Redis:常用数据类型及其应用场景

String类型的应用场景:常规计数:因为 Redis 处理命令是单线程,所以执行命令的过程是原子的。因此 String 数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等等。分布式锁:SET 命令有个 NX 参数可以实现key不存在才插入,可以用它来实现分布式锁:如果 key 不存在,则显示插入成功,可以用来表示加锁成功;如果 key 存在,则会显示插入失败,可以用来表示加锁失败。

2024-02-18 17:24:21 1114

原创 MySQL:MVCC原理详解

MySQL是允许多用户同时操作数据库的,那么就会出现多个事务的并发场景。的问题。而解决这些问题所用到的方法就是:MVCC 多版本并发控制。而这个MVCC的实现是基于read view是一个数据库的内部快照,它记录了数据库在的数据信息。read view用于实现事务的隔离性,即在并发事务中,一个事务能看到哪些数据,以及哪些数据对其他事务不可见。read view的和事务的隔离级别有关,例如,在隔离级别下,read view会在生成,而在隔离级别下,read view会在执行时生成。

2024-01-29 13:04:01 968 1

原创 MySQL:三大日志(binlog、redolog、undolog)

binlog的主要作用是用于数据复制,再数据库主从架构中,主数据库接受更新请求,而从数据库接收查询请求。这样再加锁时主数据再收写到锁封锁时,从数据库也还能接收查询请求。而保证主从数据库数据一致性用到的就是Binlog日志。它记录了修改主数据库所有修改数据的操作,从数据库只需要按照这个日志就能实现数据复制了。

2024-01-28 18:14:43 1072

原创 MySQL:事务隔离级别详解

脏读:当事务A对一个数据进行修改,但这个操作还未提交,但此时事务B就已经读取到了这个修改后的数据,并依据这个修改后的数据进行接下来的操作。这就是脏读。不可重复读:当事务A读取数据,然后对这个数据进行操作,然后再操作期间事务B对这个数据进行了修改,则等事务A再次读取这个数据时,和一开始读取到的值并不一样,这就是不可重复读。幻读:幻读和不可重复读有点类似,幻读是事务A对表中所有属“猪”的人删掉,而此时事务B对表中查入一条属“猪”的人的数据,并进行提交,此时事务A就会以为出现幻觉了,没有进行删除操作。

2024-01-27 20:14:50 636

原创 MySQL:数据库索引详解

索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树, B+树和 Hash。索引的作用就相当于目录的作用。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。毕竟大部分系统的读请求总是大于写请求的。 另外,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

2024-01-27 10:42:38 985

原创 Java并发编程:synchronized锁升级过程

锁的状态有四种,级别从高到低分别为:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这个锁的状态会随着并发激烈情况逐渐升级,锁的状态升级但不能降级。引入这些状态时为了减少获得锁和释放锁带来的性能消耗。经过研究表明,大多数情况下,锁不仅不存在多线程竞争,而且大多数都是由同一个线程多次获得,这种情况下如果没有线程和线程A竞争锁,但线程A每次获取锁都要修改对象头,指向线程A,那么太过消耗资源。而偏向锁所做的就是再对象头和栈帧中的锁记录中存锁偏向的线程ID,等以后该线程进入和退出同步块是都不需要进行CAS操作进

2024-01-22 17:12:42 821

原创 JVM:Java类加载机制

就是将 java的字节码文件(.Class)文件加载到内存当中,然后在方法区当中根据这个文件构建这个类的类模型,这个类包含了从字节码文件中解析出来的常量池、类方法、等信息。初始化阶段是类加载的最后一个步骤,再之前的加载阶段中处理加载阶段可以用用户子自定义类加载器的方式参与,其他时候都是由JVM自己主导控制的,到了初始化阶段才正式的使用我们自己写的java代码了,再这个阶段有一个执行类构造器方法需要我们去了解:()方法,这个给方法并不是我们编写的,而是javac编译器自动生成的。

2024-01-20 16:39:14 1790

原创 排序算法:快速排序、堆排序

为什么要j(右)游标必需先动?因为j停下来后i(左)可能会直接碰到j,此时j可直接与left交换, 因为j所指的一定比left小。如果i先动,j还没找到比base小的值, 就因碰到i停下,此时如果j所指比base大交换后就出错了。我选取的是第一个元素作为base,如果是最后一个则反过来。

2024-01-19 17:57:48 471

原创 JVM:垃圾收集器(7种)

CMS(Concurrent Mark Sweep)收集器是以获取最短回收停顿时间的为目标的收集器。注重服务的响应速度,希望系统停顿时间尽可能短,以给用户更好的交互体验。这个收集器是基于标记清除算法实现的。用于老年代的收集。收集过程有四个阶段:1、初始标记 2、并发标记 3、重新标记 4、并发清除四个阶段中初始标记和重新标记仍需要暂停所有的用户线程(Stop The World),但为什么说这个收集器也暂停了所有的线程,为什么还能做到停顿时间

2024-01-19 15:15:46 1931

原创 JVM:垃圾回收机制(GC)

标记的不要回收的对象,但我们要操作的是不需要回收的对象,此时我们所需要的时间就会少很多。通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。先把需要清除的对象进行标记,再标记完成后,统一回收掉所有被标记的对象,也可反过来,标记存活的对象,统一回收所有未被标记的对象。

2024-01-18 20:36:51 1411

原创 利用工具JStack排查:死锁问题和CPU100%问题

无论是再面试过程中还是再实际项目开发当中我们都有可能遇到这两个问题。我之前有同学面试这两个问题都有问道过。哈哈哈。所以我绝对把他们了解下并利用博客记录。 JStack可以显示Java应用程序中每个线程的堆栈跟踪,帮助开发人员诊断线程相关的问题,比如死锁和性能问题。通过使用JStack,开发人员可以查看线程的状态、锁定信息以及线程调用堆栈,从而更好地理解应用程序的运行状况。命令介绍:jstack -F [-m] [-l] :这个命令会在Java进程响应时生成线程转储。-m选项会同时显示

2023-12-11 18:14:33 1649

原创 操作系统:读者写者问题

开始来了一些读者读数据,它们全部进入读者队列,此时来了一个写者,执行 P(flag) 操作,使得后续到来的读者都阻塞在 flag 上,不能进入读者队列,这会使得读者队列逐渐为空,即 rCount 减为 0。上面的这种实现,是读者优先的策略,因为只要有读者正在读的状态,后来的读者都可以直接进入,如果读者持续不断进入,则写者就无法得到运行。对比方案一的读者优先策略,可以发现,读者优先中只要后续有读者到达,读者就可以进入读者队列, 而写者必须等待,直到没有读者到达。,此时写者才可以进入临界区执行写操作。

2023-12-10 21:12:41 517

原创 Java多线程万字详解(基础概念、多线程实现方式、锁、消费者机制、线程池)

锁的使用的场景:因为线程执行时是具有随机性的,并不是把线程中的方法全部跑完才换下一个线程,而是无论线程跑到任何位置都有可能结束,运行下一个线程。此时就会倒是数据安全问题。 线程池主要核心原理:创建一个池子,池子当中是空的,提交任务时,池子会创建新的线程对象,任务执行完毕,线程会归还给池子,下次再次提交任务时,不需要创建新的线程,直接复用已有的线程即可。如果提交任务时,池子中没有空闲线程,也无法创建新的线程,队伍就会排队等待。

2023-12-06 14:35:18 890

原创 操作系统:进程调度算法(FCFS、SJF、HRRN、RR、HPF、MFQ)

​时间片轮转调度算法(RR):这的基本思想是将CPU的时间分割成若干个小的时间段,称为时间片,将这个时间片分给每一个进程,在这段时间内这个进程会在CPU中执行在这个法 中有两种情况程序会让出CPU:当时间片用完了之后这个进程的程序还没有执行完毕,则会让出CPU重新进入就绪队列等待被选中,CPU会继续从就绪队列中选择下一个进程执行。当时间片还没用完,程序发生阻塞或者执行完毕,也会立即让出CPU。在这个算法中时间片的大小很重要,要是太小则会导致CPU上下文切换频繁,浪费资

2023-12-04 12:04:03 808

原创 Linux内存回收:LRU算法

linux操作系统再内存不足时会使用Swap机制,将一些不经常使用的匿名内存页放到磁盘当中,等下次需要时再读取到内存当中,而这个LRU算法就是用来选择把哪些不常使用的匿名内存页放到磁盘当中的。:最近最少使用。其原理就是:当内存不足时,淘汰系统中最少使用的内存,这样对系统性能的损耗是最小的。为了实现LRU算法,内核维护了两个和。活跃内存页链表。也就是说进程会经常访问这个链表中的内存页,所以进行内存淘汰时,不应该淘汰这个链表中的内存页。不活跃内存页链表。

2023-11-28 16:53:04 467

原创 Linux中的内存回收:Swap机制(图文并茂)

Swap机制是什么 :Swap机制是一种利用磁盘空间来扩展内存的方法。当系统的物理内存不足时,可以把一些不常用的内存数据写入到磁盘上的Swap分区,从而释放出更多的内存给其他需要的进程。当这些内存数据再次被访问时,系统会把它们从磁盘读回到内存中,这个过程称为换入(swap in)。相反,把内存数据写入到磁盘的过程称为换出(swap out),应用程序实际可以使用的内存空间将远远超过系统的物理内存。Swap 就是把一块磁盘空间或者本地文件,当成内存来使用。

2023-11-28 15:48:43 909

原创 HashMap详解(扩容机制、底层结构、适用场景)

1.7:数组+链表 (由于是链表长度长了。查询效率不高。所以在设计初衷1.7的hash算法更复杂。数据也更散列)1.8:数组+链表+红黑树(JDK8中即使用了单向链表,也使用了双向链表,双向链表主要是为了红黑树相关链表操作方便,应该在插入,扩容,链表转红黑树,红黑树转链表的过程中都要操作链表),HashMap的扩容是通过调用resize()方法实现的。java1.8+在扩容时,不需要重新计算元素的hash进行元素迁移。而是用原先位置key的hash值与旧数组的长度(oldCap)进行"与"操作。

2023-11-27 13:23:23 590

原创 Netty实现websocket且实现url传参的两种方式(源码分析)

通过源码我们可以看出如果checkStartWith设为false的话,则必须url和websocketPath相等,否则会返回false。如果设置为true的话则只需要websocketPath是具体的url的前缀就行。当最后返回false时,连接就无法建立。我们看源码这是一个处理类WebSocketServerProtocolHandshakeHandler,这是WebSocketServerProtocolHandler这个处理类再创建的时候给加pipelien()

2023-11-24 10:58:55 2002

原创 VUE项目部署过程中遇到的错误:POST http://124.60.×××.××:9090/test/login 405 (Not Allowed)

后面我查了些,nginx部署确实不支持post访问静态资源,而此时我们进行nginx转发后他会默认使用GET请求。但主要原因还是我们没有重新编写我们的路由策略。我当初报了这个405错误,再网上查了半天,他们都说什么是nginx部署不支持post访问静态资源。我再vue中有使用devServer:{ proxy:{} }进行路由转发。中生效,当你将vue部署后就走不到这个配置当中,也就是说这里的路由转发并。所以我们需要在nginx转发里自己再写一份转发策略。

2023-11-23 13:55:39 652

原创 Docker部署Vue+Springboot项目

因为我们需要将这个jar包打成镜像放在docker上运行,那么我们需要一个配置文件用于镜像的运行。图片中的Dockerfile就是这个配置文件,要注意这个两个文件要放在同一目录下。那么现在就开始来编写配置文件。要在classRom目录下执行这条语句,注意最后还有一个“.”,这个点表示的是当前目目录,表示使用当前目录下的Dockerfile文件进行镜像的构建一个名字为classroom-realtime-feedback的镜像。

2023-11-23 13:38:03 1698

原创 课程设计:C++实现哈夫曼编码

//1:先计算每个字符的权重//2:构建哈夫曼树//3:得出每个字符的哈夫曼编码。//4:根据哈夫曼编码转化为字符

2023-11-20 14:27:27 322

原创 cookie 和 session的区别(简单易懂)

Cookie是访问某些网站以后在本地存储的一些网站相关的信息,下次再访问的时候减少一些步骤。浏览器端第一次发送请求到服务器端,服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端,浏览器端再次访问服务器端时会携带服务器端创建的Cookie,服务器端通过Cookie中携带的数据区分不同的用户我们登录某一个网站时需要输入用户名及密码,如果用户名和密码保存为cookie,则下次我们登录该网站的时候就不需要再输入用户密码了。

2023-11-20 14:18:29 393

原创 io多路复用:select、poll和epoll

首先我们需要使用epoll_create方法在内核当中创建epoll对象。再epoll对象中有一个红黑树。这个红黑树的作用就相当于fds(文件描述符集合)。再这颗树上存着要检测的socket文件。再之前的select/poll中是没有再内核中专门创建存放fds的空间的,导致每次调用都要将fds拷贝一遍到内核当中。而此时epoll使用红黑树将fds一直存在内核当中,不再需要每次进行拷贝,当需要增加新的带检测的socket时直接调用epoll_ctl进行添加就行,时间复杂度为(logn)。

2023-11-19 20:02:57 389

原创 微服务面试问题小结( 微服务、分布式、MQ、网关、zookeeper、nginx)

nginx几种常见的负载均衡策略。根据权重负载均衡:在轮询策略的基础上指定轮询的几率根据ip负载均衡:指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。轮询:每个请求会按时间顺序逐一分配到不同的后端服务器。随机:就是随机分配

2023-11-15 14:33:42 951 1

原创 BIO、NIO、AIO三者的区别及其应用场景(结合生活例子,简单易懂)

NIO是同步非阻塞模型,这个模型通过使用多路复用器将进行分离,由一个选择器(select)大量的文件描述符(一个文件描述符代表着一个socket,因为再linux中万物皆文件),当有事件发生时,选择器会接收到消息并将这些有事件发生的管道返回给应用程序进行处理。当然选择器返回给应用程序的是哪些管道有事件发生,并没有进行操作,所以读取这些操作还得有自己进行读取,再这里就是同步。并不进行阻塞,因为通过选择器将监测和读取进行了分离,使这个模型不再阻塞。

2023-11-15 11:46:34 812

原创 Linux根目录下的目录结构及其作用详解

Linux根目录是文件系统的最顶层,它包含了一些子目录,每个子目录都有特定的功能和存储的文件。只有了解了各个文件的使用功能,才能更好的去使用Linux系统。希望通过下面这张图能够让你更加了解根目录下的各个目录的功能。

2023-11-01 16:01:35 420

原创 在大数对10^9 + 7取余时精度丢失

由于答案可能是一个很大的数字,因此需要将结果对10^9+7取余后返回。double类型的数在Java中是用64位二进制来表示的,其中有一部分是用来表示指数的。当一个double类型的数太大或太小的时候,它会出现溢出或下溢的情况,导致精度损失或变成无穷大或零。b%(Math.pow(10,9)+7)时,你实际上是将一个long类型的数和一个double类型的数进行取余运算,这会导致隐式类型转换

2023-10-31 15:00:47 783

原创 vue数组中的变更方法和替换方法

变更方法,顾名思义,就是会对调用它们的原数组进行变更。相对地,也有一些不可方法,例如flter(),concat()和slice(),这些都不会更改原数组,而总是返回一个新数组。当遇到的是非变更方法时,我们需要将旧的数组替换为新的.Vue 能够侦听响应式数组的变更方法,并在它们被调用时触发相关的更新。// 将新数组赋值给旧数组。这样就完成了Vue替换一个新的数组的操作。

2023-10-25 16:54:19 1329

原创 TCP和UDP的原理及其区别(三次握手、四次挥手)

TCP和UDP的主要区别在于它们提供的服务和特性。TCP提供可靠的、有序的、基于连接的数据传输,适用于对数据完整性和可靠性要求较高的应用(邮件、短信)。UDP提供不可靠的、无序的数据传输,适用于对实时性要求较高的应用(视频通话)。选择使用TCP还是UDP取决于应用的需求和优先级,需要权衡数据的可靠性、延迟和带宽利用率等因素。进行一个类比就是:将TCP比作是打电话:必须要对方接通才能进行通话,最后进行挂断。UDP是写信:只管将要写的内容写入信中发出去,不管对方是否收到,内容是否被篡改等等。

2023-10-21 21:06:03 677

原创 计算机网络的七层结构、五层结构和四层结构

这个就和我们平常写程序一样,高内聚、低耦合。将网络进行分层我们就可以根据每一层的功能分开开发设计,将复杂的网络问题分解为更简单和清晰的小问题,方便设计、实现和标准化。无需在意其他层是如何实现的,再使用时只要调用其接口就好了。假如某一时刻某一层的技术得到了大幅度进步,此时直接应用就好了,无需考虑其他层。这样也提高的网络设计的灵活性。

2023-10-21 16:15:33 892 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除