自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(108)
  • 资源 (1)
  • 收藏
  • 关注

原创 阿里云服务器上安装ElasticSearch基于CentOS 7.8,并且在本地Windows上可以通过Kibana访问

在单节点环境中运行,因此它不需要进行集群发现(discovery)。在单节点环境中,不涉及到与其他节点通信的情况,因此关闭集群发现可以简化配置。创建一个新的 .repo 文件,添加 Elasticsearch 仓库信息。解压后,在config文件中找到kibana.yml ,找到 elasticsearch.hosts 配置项。首先,配置阿里云服务器。进入编辑模式:按下 i 键,此时光标左下角会显示。: 设置 HTTP 访问的端口,默认是 9200。保存并退出:按下 Esc 键,然后输入。

2024-01-25 17:51:16 564

原创 如何理解BIO、NIO、AIO的区别

同步阻塞I/O,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制来改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务端资源要求比较高,并发局限于应用中,在jdk1.4以前是唯一的io现在,但程序直观简单易理解。...

2022-08-09 15:15:24 340 1

原创 Session&Cookie&token

服务器为了保存用户状态而创建的一个特殊的对象。当浏览器第一次访问服务器时,服务器创建一个session对象(该对象有一个唯一的id,一般称之为sessionId),服务器会将sessionId以cookie的方式发送给浏览器。当浏览器再次访问服务器时,会将sessionId发送过来,服务器依据sessionId就可以找到对应的session对象。...

2022-07-25 15:50:19 259

原创 Elasticsearch和MongoDB对比

速度:MongoDB比一般的关系型数据库快很多,作为面向文档的NoSQL数据库,MongoDB可以通过索引使访问文档变得很容易而且快速分片:MongoDB另外一个优势是允许用户存储大量的数据,其通过分片的方式将数据分发到多个服务器上。灵活性:因为MongoDB是非结构化的数据库系统,而且多种数据类型,所以不需要像关系型数据那样,进行特别的表结构设计,存储数据更加灵活分布式:MongoDB数据库默认支持分布式,内带分布式的解决方案es更侧重数据的查询, 各种复杂的花式查询支持的很好, 相比来说 Mong

2022-07-13 11:16:14 1574

原创 Elasticsearch 进阶

索引是ElasticSearch存放数据的地方,可以理解为关系型数据库中的一个数据库。(索引的名字必须是全部小写,不能以下划线开头,不能包含逗号)映射就是创建索引时指定都包含哪些字段以及字段的数据类型、分词器等一些设置, 类似表的结构约束一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有10亿文档数据的索引占据1TB的磁盘空间,而任一节点都可能没有这样大的磁盘空间。或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,每一份就称之为分片

2022-07-13 11:07:55 415

原创 Elasticsearch数据结构——倒排索引

先介绍一下正向索引: 当用户发起查询时(假设查询为一个关键词),搜索引擎会扫描索引库中的所有文档,找出所有包含关键词的文档,这样依次从文档中去查找是否含有关键词的方法叫做正向索引。互联网上存在的网页(或称文档)不计其数,这样遍历的索引结构效率低下,无法满足用户需求。正向索引结构如下:文档1的ID→单词1的信息;单词2的信息;单词3的信息…文档2的ID→单词3的信息;单词2的信息;单词4的信息…为了增加效率,搜索引擎会把正向索引变为反向索引(倒排索引)即把“文档→单词”的形式变为“单词→文档”的形式。

2022-07-12 14:43:05 3234

原创 InnoDB,快照读,在RR和RC下有何差异?

先说结论:InnoDB表:t(id PK, name);表中有三条记录:1, shenjian2, zhangsan3, lisiA1: start transaction;B1: start transaction;A2: select * from t;B2: insert into t values (4, wangwu);A3: select * from t;B3: commit;A4: select * from t;提问1:假设事务的隔离级别是可重复读RR,事务A中的三次

2022-07-01 10:36:55 315

原创 双亲委派机制的原理和作用是什么?

Java类加载器(ClassLoader)是Java运行时环境(JRE)的一部分,负责动态的将Java类加载到Java虚拟机的内存空间。主要有三个:好了,上面做了那么多铺垫,终于来到了今天的重头戏:双亲委派机制!双亲委派机制指的是,当某个特定的类加载器在收到类加载的请求时,会遵循下面的规则顺序:首先判断被加载的类是否已经加载过,如果是则结束,否则会将加载任务委托给自己的父亲;父类加载器在收到类加载的请求时,也会先判断被加载的类是否已经加载过,如果是则结束,否则同样将加载任务委托给自己的父亲不断的循环进行步骤

2022-06-06 16:19:27 166

原创 RabbitMQ延迟队列

延迟队列概念延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。延迟队列使用场景订单在十分钟之内未支付则自动取消新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒。用户注册成功后,如果三天内没有登陆则进行短信提醒。用户发起退款,如果三天内没有得到处理则通知相关运营人员。预定会议后,需要在预定的时间点前十分钟通知各个与会人员参加会议这些场景都有

2022-05-26 13:53:57 135

原创 RabbitMQ之死信队列

死信的概念先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到queue 里了,consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列。应用场景:为了保证订单业务的消息数据不丢失,需要使用到 RabbitMQ的死信队列机制,当消息消费发生异常时,将消息投入死信队列中.还

2022-05-26 13:22:40 113

原创 RabbitMQ使用以及原理解析

Broker我们知道如果要使用RabbitMQ,必须先要安装一个RabbitMQ服务。这个服务就是Broker,中文叫做代理,因为MQ服务器帮我们对消息做了存储和转发。一般情况下为了保证服务的高可用,需要多个Broker。Connection无论生产者或是服务者都需要与Broker建立连接,这个连接就是Connection,它是一个TCP的长连接。Channel为了节省服务器资源,避免建立太多的长连接,我们需要复用连接。于是就有了Channel的概念。我们可以在保持的TCP长连接里面...

2022-05-26 11:05:25 551

原创 RabbitMQ交换机(Exchanges)

Exchanges 概念RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。相反,生产者只能将消息发送到交换机(exchange),交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将它们推入队列。交换机必须确切知道如何处理收到的消息。是应该把这些消息放到特定队列还是说把他们到许多队列中还是说应该丢弃它们。这就的由交换机的类型来决定。Exchanges 的类型总共有以下类型:直接(dire

2022-05-26 11:02:36 1229

原创 什么是缓存雪崩、缓存击穿、缓存穿透?

缓存雪崩什么是缓存雪崩?当某一个时刻出现大规模的缓存失效的情况,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。这就是缓存雪崩。分析:造成缓存雪崩的关键在于在同一时间大规模的key失效。为什么会出现这个问题呢,有几种可能,第一种可能是Redis宕机,第二种可能是采用了相同的过期时间。搞清楚原因之后,那么有什么解决方案呢?解决方案:在原有的失效时间上加上一个随机值,比如

2022-05-25 11:36:18 131

原创 TCP四次挥手及原因

聚散终有时,TCP 断开连接是通过四次挥手方式。双方都可以主动断开连接,断开连接后主机中的「资源」将被释放。上图是客户端主动关闭连接 :一次挥手客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。二次挥手服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态。三次挥手客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态.

2022-05-24 15:59:52 12586 1

原创 【TCP/IP】三次握手过程及原因

三次握手三次握手 建立起 TCP连接 的 reliable,分配初始序列号和资源,在相互确认之后开始数据的传输。有 主动打开(一般是client) 和 被动打开(一般是server)。TCP使用3次握手建立一条连接,该握手初始化了传输可靠性以及数据顺序性必要的信息,这些信息包括两个方向的初始序列号,确认号由初始序列号生成,使用3次握手是因为3次握手已经准备好了传输可靠性以及数据顺序性所必要的信息,该握手的第3次实际上并不是需要单独传输的,完全可以和数据一起传输。详细过程如下所示:第一步,Client会

2022-05-24 10:40:58 4424

原创 Redis持久化

Redis 的持久化策略有两种:RDB:快照形式是直接把内存中的数据保存到一个 dump 的文件中,定时保存,保存策略。AOF:把所有的对 Redis 的服务器进行修改的命令都存到一个文件里,命令的集合。Redis 默认是快照 RDB 的持久化方式。当 Redis 重启的时候,它会优先使用 AOF 文件来还原数据集,因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。你甚至可以关闭持久化功能,让数据只在服务器运行时存。RDB持久化RDB持久化是将当前进程中的数据生成快照保存到硬

2022-05-23 13:59:50 146

原创 Redis 过期删除策略和内存淘汰策略

Redis的内存回收机制和内存过期淘汰策略Redis的内存回收主要围绕以下两个方面:1.Redis过期策略删除过期时间的key值2.Redis淘汰策略内存使用到达maxmemory上限时触发内存淘汰数据Redis的过期策略和内存淘汰策略不是一件事,实际研发中不要弄混淆了,下面会完整的介绍两者。Redis过期策略过期策略通常有以下三种:1.定时过期每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处

2022-05-23 11:25:15 380

原创 Redis 是单线程还是多线程

Redis 是单线程还是多线程我们平时看到介绍 Redis 的文章,都会说 Redis 是单线程的。但是我们学习的时候,比如 Redis 的 bgsave 命令,它的作用是在后台异步保存当前数据库的数据到磁盘,那既然是异步了,肯定是由别的线程去完成的,这怎么还能说 Redis 是单线程的呢?其实通常说的 Redis 是单线程,主要是指 Redis 对外提供键值存储服务的主要流程,即网络 IO 和键值对读写是由⼀个线程来完成的。除此外 Redis 的其他功能,比如持久化、 异步删除、集群数据同步等,是由额

2022-05-20 14:10:07 3199

原创 Redis中hash、List、Set、Sorted Set数据结构

字典类型 (Hash)字典类型 (Hash) 又被成为散列类型或者是哈希表类型,它是将一个键值 (key) 和一个特殊的“哈希表”关联起来,这个“哈希表”表包含两列数据:字段和值。例如我们使用字典类型来存储一篇文章的详情信息,存储结构如下图所示:同理我们也可以使用字典类型来存储用户信息,并且使用字典类型来存储此类信息,是不需要手动序列化和反序列化数据的,所以使用起来更加的方便和高效。Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是SpringDat

2022-05-20 13:42:38 342

原创 Redis数据结构——String类型

Redis数据结构——String类型应用场景页面数据缓存我们知道,一个系统最宝贵的资源就是数据库资源,随着公司业务的发展壮大,数据库的存储量也会越来越大,并且要处理的请求也越来越多,当数据量和并发量到达一定级别之后,数据库就变成了拖慢系统运行的“罪魁祸首”,为了避免这种情况的发生,我们可以把查询结果放入缓存(Redis)中,让下次同样的查询直接去缓存系统取结果,而非查询数据库,这样既减少了数据库的压力,同时也提高了程序的运行速度。介于以上这个思路,我们可以把文章详情页的数据放入缓存系统。具体的做法

2022-05-20 10:49:08 536

原创 字符串对象的底层存储结构-简单动态字符串(Simple dynamic string)简称SDS

字符串对象Redis是使用C语言进行编写的,而C语言中的字符串是二进制不安全的,所以Redis就没有直接使用C语言的字符串,而是自己编写了一个新的数据结构来表示字符串,这种数据结构称之为:简单动态字符串(Simple dynamic string),简称SDS。为什么Redis的字符串对象是二进制安全的在C语言中,字符串采用的是一个char数组(柔性数组)来存储字符串,而且字符串必须要以一个空字符串’\0’来结尾。字符串并不记录长度,所以如果想要获取一个字符串的长度就必须遍历整个字符串,直到遇到’\0

2022-05-20 10:41:24 218

原创 Docker 安装 ActiveMQ

获取 ActiveMQ 镜像docker pull webcenter/activemq查看本地镜像docker imagedocker 启动 ActiveMQ 命令docker run -d --name activemq -p 61617:61616 -p 8162:8161 webcenter/activemq61616是 activemq 的容器使用端口(映射为61617)8161是 web 页面管理端口(对外映射为8162)如果想创建多个mq完全可以改一下名字和

2022-05-17 14:15:05 667

原创 SpringBoot自动装配原理

SpringBoot所具备的特征有:可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;内嵌Tomcat或Jetty等Servlet容器;提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;尽可能自动配置Spring容器;提供准备好的特性,如指标、健康检查和外部化配置;绝对没有代码生成,不需要XML配置。SpringBoot会将所有的功能场景都封装成一个一个的启动器,供开发人员使用。主程序//@Spr

2022-05-17 10:56:22 353

原创 详细分析一下 #{}和${}的区别是什么

正确的答案是:#{}是预编译处理,${}是字符串替换。(1)mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值。(2)mybatis在处理时,就是把{}时,就是把时,就是把{}替换成变量的值。(3)使用#{}可以有效的防止SQL注入,提高系统安全性。原因在于:预编译机制。预编译完成之后,SQL的结构已经固定,即便用户输入非法参数,也不会对SQL的结构产生影响,从而避免了潜在的安全风险。(4)预编译是提前对SQL语句进行预编译,而其后

2022-05-13 17:35:54 5858

原创 Mybatis 一级缓存

缓存的概念什么是缓存存在于内存中的临时数据。为什么使用缓存减少和数据库的交互次数,提高执行效率。(因为查询数据库是一件很费时很费效率的事,还涉及一些硬盘等io操作,而缓存是存在内存中的,读取都很快,而且效率高)什么样的数据能使用缓存,什么样的数据不能使用适用于缓存经常查询并且不经常改变的。数据的正确与否对最终结果影响不大的。不适用于缓存经常改变的数据数据的正确与否对最终结果影响很大的。例如:商品的库存,银行的汇率,股市的牌价。什么是一级缓存mybatis 默认情况下只会开启一

2022-05-13 15:15:27 1874

原创 MyBatis的工作原理

MyBatis的工作原理1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。3)构造会话工厂:通过 MyBatis 的环

2022-05-13 14:52:00 129

原创 Docker for Windows中安装redis并把本地文件夹 映射到docker的容器中

拉取镜像docker pull redis查看镜像docker images启动并且映射docker run -p 6777:6379 -v /D/Docker/redis/data:/data -d redis redis-server --appendonly yeswindows下启动做映射的时候会弹出点 share it第一次有可能会提示你输入电脑的登录密码,输入就可以了。查看容器docker ps进入容器docker exec -it 36a61b975a

2022-05-13 09:47:34 708

原创 SpringMVC 常用注解

@Controller@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。@RequestMappingRequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方

2022-05-12 16:55:14 216

原创 Tomcat和SpringMVC的关系

Tomcat是一个web服务器&&应用流程1) 用户通过浏览器进行了一个操作,比如输入网址并回车,或者是点击链接,接着浏览器获取了这个事件。2) 浏览器向服务端发出TCP连接请求。3) 服务程序接受浏览器的连接请求,并经过TCP三次握手建立连接。4) 浏览器将请求数据打包成一个HTTP协议格式的数据包。5) 浏览器将该数据包推入网络,数据包经过网络传输,最终达到端服务程序。6) 服务端程序拿到这个数据包后,同样以HTTP协议格式解包,获取到客户端的意图。7) 得知客户端意图

2022-05-12 15:41:18 3121 1

原创 一张图解决Spring MVC执行流程

2022-05-12 11:19:17 92

原创 Windows端Docker配置Mysql

1.拉去mysql镜像docker pull mysql:5.72.查看并启动镜像#列出已下载的镜像docker images#启动容器,挂载配置文件和数据docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -i -p 3306:3306 mysql启动成功很多人都会问我,为社么没有设置挂载目录。稍后再说进入容器内bash,连接mysqldocker exec -it mysql bash注意:我这里使用的是Git

2022-05-12 11:17:12 543 1

原创 Spring生命周期

关于懒加载**scope=“prototype”**在用到对象的时候,才创建对象。**scope=“singleton”**在启动(容器初始化之前),就已经创建了bean,且整个应用只有一个。先创建bean对象,然后把bean放到容器的map中,完成容器的初始化。Spring默认状态是单例的,单例默认状态是非懒加载的、多例状态是默认懒加载的,只要是多例模式都是懒加载,只有在单例模式下才能控制懒加载有效Bean的生命周期...

2022-05-11 14:06:30 3541

原创 Spring循环依赖以及为什么需要三级缓存

什么是循环依赖?A创建时—>需要B---->B去创建—>需要A,从而产生了循环什么情况下循环依赖可以被处理?从上面的测试结果我们可以看到,不是只有在setter方法注入的情况下循环依赖才能被解决,即使存在构造器注入的场景下,循环依赖依然被可以被正常处理掉。三级缓存三级缓存是通用的叫法。如果只有一级缓存实例化A对象。填充A的属性阶段时需要去填充B对象,而此时B对象还没有创建,所以这里为了完成A的填充就必须要先去创建B对象;实例化B对象。执行到B对象的填充属性阶

2022-05-11 10:28:17 11281 17

原创 spring中bean的线程安全问题

Bean的线程安全分析对于prototype作用域的Bean,每次都创建一个新对象,也就是线程之间不存在Bean共享,因此不会有线程安全问题。对于singleton作用域的Bean,所有的线程都共享一个单例实例的Bean,因此是存在线程安全问题的。但是如果单例Bean是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。解释一下:无状态Bean(Stateless Bean):就是没有实例变量的对象,不能保存数据,是不变类,是线程安全

2022-05-10 15:33:48 2572 1

转载 AOP中的动态代理的区别--JDK和CGLIB

区别spring AOP的底层实现机制是动态代理,动态代理有JDK 和CGLIB 动态代理下面说一下这两种动态代理的区别:1、JDK动态代理只提供接口的代理,不支持类的代理jdk会在运行时为目标类生成一个 动态代理类$proxy*.class该代理类是实现了目标类接口的一个类,并且会实现接口所有的方法增强代码调用时 通过先去调用处理类进行增强,再通过反射的方式进行调用目标方法,从而实现AOP2、如果代理类 没有实现接口,那么spring AOP会选择使用CGLIB来动态代理目标类CGL

2022-05-10 10:39:36 1787

原创 单例设计模式在Spring中的应用

一.实现一个单例可以使用如下的步骤实现一个单例类:单例设计模式的实现流程1、将构造方法私有化,使用private关键字修饰。使其不能在类的外部通过new关键字实例化该类对象。2、在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型。3、对外提供一个静态方法getInstance()负责将对象返回出去,使用public static修饰首先单例方法的构造方法是一个私有的方法,不可以通过构造器的方式进行构建,只能通过getInstance()方法获取单例。下边的i

2022-05-09 15:01:00 1939

原创 Git错误解决

Cloning into '仓库'...kex_exchange_identification: read: Connection reset by peerConnection reset by 9.112.19*.1** port 22fatal: Could not read from remote repository.今天进一个新项目,down代码时发生的错误,试了各种方法,原来是我账号变更密码 本地没有更新,所以下载代码对出这个问题。首先打开控制面板——————》找到在这两个里边翻

2022-05-09 10:32:52 695

原创 Spring AOP——Spring 中面向切面编程

部分参考资料: 《Spring实战(第4版)》《轻量级 JavaEE 企业应用实战(第四版)》什么是 AOPAOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。从该图可以很形象地看出,所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。为什么需要 AOP让你对每个功能都做个日志功能。你会发现,时.

2022-04-27 16:24:58 98

原创 Spring面经

spring di 的原理然后又问了一下我自己对 SpringBoot 的理解你觉得 Spring 框架的 Listener 是什么模式,你用过吗?你对 Spring 的了解是通过什么学习的呢?你能说一下 Listener 的执行顺序吗?你了解 Spring 的 AOP 编程吗?那 AOP 有几种切面?spring 源码的理解springboot 启动流程。SpringMVC 和SpringBoot 的区别SpringMVC 处理请求url 的过程Spring 中应该用了很多设计模式吧,说

2022-04-25 23:14:40 543

原创 Spring作用域相关知识singleton 和 prototype

创建一个user对象@Datapublic class User { private String id; private String name; private Integer age;}创建一个applicationContext.xml的配置文件<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.springframework.org/schema/beans"

2022-04-15 10:02:19 133

日文式样书

对日开发文档,可以用来做模板。我也是一个对日外包开发人员。

2019-04-22

空空如也

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

TA关注的人

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