自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 什么是线程池,如何实现的?

第二个红框:判断线程池是否在运行,如果在,任务队列是否允许插入,插入成功再次验证线程池是否运行,如果不在运行,移除插入的任务,然后抛出拒绝策略。如果在运行,没有线程了,就启用一个线程。第一个红框:workerCountOf方法根据ctl的低29位,得到线程池的当前线程数,如果线程数小于corePoolSize,则执行addWorker方法创建新的线程执行任务;线程池,说的就是提前创建好一批线程,然后保存在线程池中,当有任务需要执行的时候,从线程池选一个线程来执行任务。如果把线程池比作一个公司。

2024-03-28 14:27:14 635

原创 创建线程有几种方式?

接口中的方法用来检查执行是否完成、等待完成和得到执行的结果。当执行完成后,只能通过get()方法得到结果,get方法会阻塞直到结果准备好了。Runnable接口和Callable接口都可以用来创建线程,实现Runnable的时候,需要实现run方法;FutureTask是Future接口的一个实现,它实现了一个可以提交给Executor执行的任务,并且可以用来检查任务的执行状态和获取任务的执行结果。Runnable的run方法无返回值,Callable的call方法有返回值,类型为Object。

2024-03-28 13:37:52 183

原创 Redis的持久化机制是怎样的?

未了防止数据丢失,Redis提供了RDB和AOF的持久化机制,Redis可以将数据从内存保存到磁盘中,以便在Redis进程异常退出或服务器断电等情况下,通过从磁盘中加载数据来恢复数据。在开启混合持久化的情况下,AOF重写时会把Redis的持久化数据,以RDB的格式写入到AOF文件的开头,之后的数据再以AOF的格式化追加到文件的末尾。混合持久化结合了RDB和AOF持久化的优点,开头为RDB的格式,使得Redis可以更快的启动,同时结合AOF的优点,又减低了大量数据丢失的风险。但是它也比RDB要更加靠谱一些。

2024-03-26 23:27:16 1145

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

对于缓存穿透,我们可以将查询的数据条件都哈希到一个足够大的布隆过滤器中,用户发送的请求会先被布隆过滤器拦截,一定不存在的数据就直接拦截返回了,从而避免下一步对数据库的压力。缓存穿透:是指缓存服务器中没有缓存数据,数据库中也没有符合条件的数据,导致业务系统每次都绕过缓存服务器查询下游的数据库,缓存服务器完全失去了其应用的作用。缓存穿透是指缓存服务器中没有缓存数据,数据库中也没有符合条件的数据,导致业务系统每次都绕过缓存服务器查询下游的数据库,缓存服务器完全失去了其应用的作用。

2024-03-25 22:15:30 837

原创 Redis为什么这么快?

4.高效的数据结构:Redis提供了多中高效的数据结构,如哈希表、有序集合、列表等,这些数据结构都被实现的非常高效,能够在O(1)的时间复杂度内完成数据读写操作,这也是Redis能够快速处理数据请求的重要因素之一。3.多路复用I/O模型:Redis在单线程的基础上,采用了I/O多路复用技术,实现了单个线程同时处理多个客户端连接的能力,从而提高了Redis的并发性能。1.基于内存:Redis是一种基于内存的数据库,数据存储在内存中,数据的读写速度非常快,因为内存访问速度比硬盘访问速度快的多。

2024-03-25 17:11:22 156

原创 RabbitMQ如何保证消息不丢?

如果消息被设置为非持久化,RabbitMQ将尽力将消息传递给消费者,但不会将其写入磁盘,这意味着如果RabbitMQ服务器在消息传递之前崩溃或重启,消息可能会丢失。2.(持久化):如果消息被设置为持久化,RabbitMQ会将消息写入磁盘,以确保即使在RabbitMQ服务器重启时,消息也不会丢失。RabbitMQ在接收到消息后,默认并不会立即进行持久化,而是把消息暂存在内存中,这时候如果MQ挂了,那么消息就会丢失。持久化消息在发送到持久化队列后,将在服务器重启后保留,以确保消息不回丢失。

2024-03-24 19:34:37 483 1

原创 RabbitMQ的事务机制

我们需要先通过txSelect开启事务,然后就可以发布消息给MQ了,如果txCommit提交成功了,则消息一定到达了RabbitMQ,如果在txCommit执行之前RabbitMQ实例异常崩溃或者抛出异常,那我们就可以捕获这个异常然后执行txRollback进行回滚事务。RabbitMQ的事务机制,允许生产者将一组操作打包成一个原子事务单元,要么全部执行成功,要么全部失败。想要保证发送者一定能把消息发送给RabbitMQ,一种是通过Confirm机制,另一种就是通过事务机制。

2024-03-24 16:29:08 381

原创 如何保障消息一定能发送到RabbitMQ?

如果由于某种原因(例如,Exchange不存在或路由键不匹配)消息无法被处理,RabbitMQ会向消息生产者发送否定信号(NACK)。我们知道,RabbitMQ的消息最终是存储在Queue上的,而在Queue之前还要经过Exchange,那么这个过程中就有两个地方可能导致消息丢失。当RabbitMQ在无法路由消息时将消息返回给消息生产者,但是如果能正常路由,则不会返回消息。为了解决这个问题,有两种方案,一种是通过confirm机制,另外一种是事务机制,因为事务机制并不推荐,这里先介绍Confirm机制。

2024-03-23 18:30:57 221

原创 RabbitMQ是如何保证高可用的?

这种集群模式下,每一个实例中的元数据都是一样的,大家都是完整的数据。在这种模式下,我们场景的Queue,它的元数据(配置信息)会在集群种的所有实例间进行同步,但是队列中的消息只会存在于一个RabbitMQ实例上,而不会同步到其他队列。这样每次在消息写入的时候,就需要在集群中的所有实例上都同步一份,这样即使有一台实例发生故障,剩余的示例也可以正常提供完整的数据和服务。消息的发送也是一样的,当发送者连接到了一个不保存消息的示例时,也会被转发到保存消息的实例上进行写操作。

2024-03-22 22:49:42 420

原创 RabbitMQ如何实现延迟消息?

基于RabbitMQ的死信队列,可以实现延迟消息,非常灵活的实现定时关单,并且借助RabbitMQ的集群扩展性,可以实现高可用,以及处理大并发量。但是,死信队列的实现方式存在一个问题,那就是可能造成队头阻塞,因为队列时先进先出的,而且每次只会判断队头的消息是否过期,那么,如果队头的消息时间很长,一直都不过期,那么就会阻塞整个队列,这时候即使排在它后面的消息过期了,那么也会被一直阻塞。RabbitMQ中是可以实现延迟消息的,一般有两种方式,分别是通过死信队列以及通过延迟消息插件来实现。

2024-03-22 18:15:54 637 1

原创 什么是RabbitMQ的死信队列

当消息变成“死信”之后,如果配置了死信队列,它将被发送到死信交换机,死信交换机将死信投递到一个队列上,这个队列就是死信队列。3.消息被拒绝:当消费者明确拒绝一条消息时,它可以被标记为死信并发送到死信队列。如果消息在规定的时间内没有被消费,它可以被认为是死信并被发送到死信队列。1.消息处理失败:当消费者由于代码错误、消息格式不正确、业务规则冲突等原因无法成功处理一条消息时,这条消息可以标记为死信。4.消息无法路由:当消息不能被路由到任何队列时,例如,没有匹配的绑定关系或路由键时,消息可以被发送到死信队列。

2024-03-22 17:20:51 832 2

原创 RabbitMQ是怎么做消息分发的?

在主题模式中,一个生产者将消息发送到交换器中,并指定主题(Topic)作为路由键,交换器根据通配符匹配将消息路由到与之匹配的队列中。在路由模式中,一个生产者将消息发送到交换器中,并指定消息的路由键,交换器根据路由键将消息路由到与之匹配的队列中。在发布/订阅模式中,一个生产者将消息发送到交换器(Exchange)中,交换器将消息广播到所有绑定的队列,每个队列对应一个消费者。RabbitMQ一共有6中工作模式(消息分发模式),分别是简单模式、工作队列模式、发布订阅模式、路由模式、主题模式、以及RPC模式。

2024-03-22 17:19:02 172

原创 RabbtiMQ如何防止重复消费

这样我们在消费者端,接收到消息以后,只需要解析出消息体中的这个唯一标识,就可以通过“一锁、二判、三更新”的方式来判断是否消费成功过了。RabbitMQ的消息消费是有确认机制的,正常情况下,消费者在消息消费成功后,会发送一个确认消息,消息队列接收到之后,就会将该消息从消息队列中删除,下次也就不会再投递了。但是如果存在网络延迟的问题,导致确认消息没有发送到消息队列,导致消息重复投递了,是有可能,所以,当我们使用MQ的时候,消费者端自己也需要做好幂等控制来防止消息被重复消费。

2024-03-22 17:01:13 210

原创 如何解决接口幂等的问题?

以上操作需要有一个前提,那就是第一步加锁、和第二步判断的时候,需要有一个依据,这个就是幂等号了,通常需要和上游约定一个唯一ID作为幂等号。比如,一次支付请求,如果支付返回处理中,或者系统异常等,我们需要重试,继续调用,直到他明确的返回支付成功,或者明确的无法成功的支付失败结果。解决接口幂等问题,只需要记住一句口令“一锁、二判、三更新”,只要严格遵循这个过程,那么就可以解决并发问题。三步需要严格控制顺序,确保加锁成功后进行数据查询和判断,幂等性判断通过后再更新,更新结束后释放锁。一锁:第一步,先加锁。

2024-03-22 17:00:50 266

原创 idea集成tomcat启动springmvc项目

2021-07-22 18:19:50 865

原创 Elasticsearch详细总结

Elasticsearch1.1、什么是ElasticsearchElasticsearch,简称Es,Es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。ES使用Java开发。Lucene作为其核心来实现所有的索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。1.2、Elasticsearch的使用案例(1)百度:百度目前广泛使用Elasticsearc

2021-06-19 13:59:45 364

原创 Dubbo+Zookeeper

1、应用架构的演进过程单一应用框架:当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改差工作量的数据访问框架(ORM)是关键。垂直应用架构:当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前段页面开发的web框架(MVC)是关键。分布式服务架构:当垂直应用越来越多,应用之前交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,是前端应用能更快速的响应多变的市场需求

2021-06-02 23:05:47 347

原创 RabbitMQ

RabbitMQ1、消息队列(MQ)1.1、什么是消息队列消息队列,即MQ,Message Queue。MQ全称为Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求,其中较为成熟的M

2021-05-28 23:58:45 681

原创 Redis的持久化

Redis的持久化1、目标Redis的高性能是由于其将素有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或者将二者结合使用。2、RDB持久化机制RDB持久化是指在指定时间间隔内将内存中的数据集快照写入磁盘,这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb,这种方式是默认已经开启了,不需要配置。RDB持

2021-05-28 16:07:58 50

原创 Redis介绍

一.Redis1.NoSqlRedis是目前非常流行的一款NoSql数据库.什么是NoSqlNoSql简介NoSQL(NoSQL=Not Only SQL),意即”不仅仅是SQL”.在现代的计算系统上每天网络上都会产生庞大的数量.这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理.1970年E.F.Codd’s提出关系模型的论文”A relational model of data for large shared data banks”,这使得数据建模和应用程序编程更加简单.通

2021-05-27 22:39:33 321

原创 关系型数据库和非关系型数据库的区别

关系型数据库和非关系型数据库的区别1.关系型数据库关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织优点:(1)易于维护:都是使用表结构,格式一致;(2)使用方便:SQL语言通用,可用于复杂查询;(3)复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询.缺点:(1)读写性能比较差,尤其是海量数据的高效率读写;(2)固定的表结构,灵活度稍欠;(3)高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈.2.非关系型数据库非关系型数据库

2021-05-27 19:25:06 91

原创 java实现String类型的xml格式文本的元素访问和修改

package com.test;import java.io.ByteArrayInputStream;import java.io.InputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;

2020-09-13 00:57:50 408

原创 IDEA在编写代码时,代码语句没有左侧语句类型图标提示解决方法.

如图所示:当idea中在编写代码的时候没有了部分图标提示,可以按照如下操作,选中你想要显示的图标,即可实现.

2019-11-12 21:17:42 2631

原创 登录页面授权认证时序图

2019-10-24 20:59:54 2404

原创 IDEA中使用框架时,applicationContext.xml提示Application context not configured for this file问题解决

spring配置文件中时常会出现这个提示,翻译过来大概意思就是没有配置该文件到项目中,按照如下操作可解决该问题.如下图所示:该问题以解决.

2019-09-27 15:51:35 2157

原创 java设计模式之单例模式

单例模式.饿汉式:(多线程程序是安全的:因为类只被加载一次,加载一次因为类加载器的全盘负责委托机制)积极加载,意思就是不管你用不用,都会创建出来该对象!(类似于学校食堂)延迟加载,也称为懒加载!(类似于小饭馆)你不用不创建,你用才创建!在一个程序中 一个类只允许产生一个对象!!如何能产生一个对象1.不允许外界new对象,构造私有化!!构造私有化之后 我们无法获取对象 那怎么办?...

2019-09-22 22:37:30 117

原创 Servlet中@WebServlet属性详解

在Servlet中,设置了@WebServlet注解,当请求该Servlet时,服务器就会自动读取当中的信息,如果注解@WebServlet("/category"),则表示该Servlet默认的请求路径为…/category,这里省略了urlPatterns属性名,完整的写法应该是:@WebServlet(urlPatterns = “/category”),如果在@WebServlet中需要设...

2019-09-05 16:28:33 54096 6

原创 关于main方法和单元测试方法文件路径问题

程序如下:package itheima02;import org.junit.Test;import java.io.File;public class Demo04Path { public static void main(String[] args) { File f = new File("day18_08_05\\src\\config.prope...

2019-08-28 20:08:29 2226

原创 浏览器开发工具请求头与响应头属性介绍

HTTP 协议的 Header 是一块数据区域,分为请求头和响应头两种类型,客户端向服务区发送请求时带的是请求头,而服务器响应客户端数据时带的是响应头。请求头里主要是客户端的一些基础信息,UA(user-agent)就是其中的一部分,而响应头里是响应数据的一些信息,以及服务器要求客户端如何处理这些响应数据的指令。请求头里面的关键信息如下:1)accept表示当前浏览器可以接受的文件类型,假...

2019-08-24 19:37:32 979

原创 request对象获取请求行

package test01;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.se...

2019-08-21 23:35:09 159

空空如也

空空如也

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

TA关注的人

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