- 博客(113)
- 收藏
- 关注
原创 RESTful简介和使用
REST:英文representational state transfer直译为表现层状态转移,或者表述性状态转移;Rest是web服务的一种架构风格,一种设计风格,是一种思想;同时Rest不是针对某一种编程语言的。一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
2024-04-24 14:10:08 635
原创 IPv6和IPV4的区别
在实际应用中,IPv6地址的某些段可能包含连续的零。为了简化表示,IPv6允许使用双冒号(::)来表示连续的零段。在这个表示中,/48表示前48位(即前三个16位段)是网络前缀,后面的地址部分则是主机地址。IPv6地址的类型和结构多种多样,可以根据不同的应用场景和需求进行配置和使用。例如,如果一个网络的所有IPv6地址都以2001:db8:开头,那么可以使用/来表示前缀长度,从而简化表示。IPv6地址由128位二进制数组成,通常被划分为8个16位的段,每段用冒号(:)隔开。
2024-04-24 13:42:41 319
原创 Mysql索引详解(索引分类)
MySQL索引是一种数据结构,用于提高查询效率和加快数据的检索速度。通过在指定的列上创建索引,MySQL可以更快地找到满足查询条件的数据,而不需要全表扫描。它可以加快数据库查询的速度,从而提高应用程序的性能。在MySQL中,索引用于快速查找、排序和过滤数据。索引类似于书本的目录,是存储引擎用于提高数据库表的访问速度的一种数据结构。在mysql内部,将热点数据,以B+树的形式将所有page页,进行组织成一定的数据结构,再用其配套的查找算法进行查找,叫做索引查询。
2024-04-23 16:15:01 715
原创 单例模式(设计模式)
单例模式:单例对象能保证在一个JVM中,该对象只有一个实例存在。保证被创建一次,节省系统开销解决的问题:保证一个类在内存中的对象唯一性所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该由人来控制,而应该由代码来限制,强制单例。单例有其独有的使用场景,一般是对于那些业务逻辑上限定不能多例只能单例的情况,例如:类似于计数器之类的存在,一般都需要使用一个实例来进行记录,若多例计数则会不准确。
2024-04-22 10:57:40 694 1
原创 Mysql优化
MYSQL优化主要分为以下四大方面:硬件及操作系统层面优化:设计:存储引擎,字段类型,范式与逆范式功能:索引,缓存,分区分表。架构:主从复制,读写分离,负载均衡。合理SQL。
2024-04-19 17:15:50 1006
原创 sql优化
索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低insert 及 update的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。在流量比较大的场景中,可以增加从库来提高数据库的负载能力,从而提升数据库的总体性能。尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
2024-04-19 16:55:20 1222
原创 线程安全和线程同步
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况不可变类,如 String、基本类型的包装类、BigInteger 和 BigDecimal 等。不可变对象天生是线程安全的线程安全是指多线程环境下,当多个线程同时访问共享资源时,保证对该资源的操作能够正确地执行,并且不会出现意外的结果或破坏数据的一致性。
2024-04-16 14:12:54 706
原创 XSS攻击
跨站脚本攻击(XSS,Cross-Site Scripting)是一种常见的安全漏洞,攻击者利用此漏洞向网页中插入恶意的客户端脚本,从而在用户的浏览器中执行恶意代码。攻击者通常利用 XSS 攻击来窃取用户的信息、会话令牌,或者篡改网页内容等。
2024-04-15 11:27:45 962 1
原创 DDoS攻击和DoS(拒绝服务)
DDoS攻击是指分布式拒绝服务攻击(Distributed Denial of Service),它是一种网络攻击手段,旨在使目标系统无法提供正常的服务,使其无法处理合法用户的请求。这种攻击通常通过大量的恶意流量来超载目标系统的网络带宽、计算资源或其他关键资源,导致服务不可用或性能严重下降。DDoS(分布式拒绝服务)攻击是一种恶意的网络攻击,旨在使目标系统无法提供正常的服务,导致服务不可用或性能严重下降。
2024-04-15 11:03:05 831
原创 HttpClient、OKhttp、RestTemplate接口调用对比( Java HTTP 客户端)
HttpClient、OKhttp、RestTemplate接口调用对比HttpClient、OkHttp 和 RestTemplate 是三种常用的 Java HTTP 客户端库,它们都可以用于发送 HTTP 请求和接收 HTTP 响应,但在一些方面有所不同。下面是它们之间的一些对比:HttpClient:Apache HttpClient:○ 成熟稳定: Apache HttpClient 是 Apache 软件基金会的一个项目,经过多年的发展,已经非常成熟和稳定。○ 灵活性: 提供了丰富的
2024-04-11 17:29:22 567
原创 MyBatis源码介绍
mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出SqlSessionFactory,然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。
2024-04-09 17:36:01 1058
原创 Mybitis详解
MyBatis 是一款优秀的持久层框架,一个半 ORM(对象关系映射)框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2024-04-09 17:28:58 750
原创 MyBatis如何实现分页
如果你使用的数据库不支持特定的分页语法,或者想要更多灵活性,你可以通过自定义 SQL 实现分页逻辑。通常,你需要通过 RowBounds 或 PageHelper 来实现分页。
2024-04-09 16:54:23 972
原创 nacos详解
一旦发现本地缓存的配置内容和服务端的配置内容有差异,那么,就表示服务器端的配置有更新。于是,需要把更新的配置拉到本地,在这个过程中,有可能因为客户端的配置比较多,而导致对比的时间较长,使得配置的同步效率非常低。尽管Nacos提供了注册中心和配置中心的功能,但根据实践经验和推荐做法,更多的团队会选择将Nacos用作配置中心,而将服务发现和注册功能交给其他工具如Consul、Eureka等来实现。最后,再加上长轮询的方式,既减少了Pull的轮询次数,又利用了长轮询的优势,很好地实现了配置动态更新的。
2024-03-29 16:03:26 1108
原创 Java日志详解
日志的定义:程序执行过程中,记录程序运行的情况的信息日志的作用:Log日志,主要用于记录程序运行的情况,以便于程序在部署之后的排错调试等,也有利于将这些信息进行持久化(如果不将日志信息保存到文件或数据库,则信息便会丢失)。
2024-03-29 11:13:58 888
原创 线程池(通俗易懂)
线程池(ThreadPool)是一种用于管理和复用线程的机制,它能够在应用程序中创建一组预先初始化的线程,这些线程可用于执行任务,从而避免了不断创建和销毁线程的开销。Java中的线程池可以通过java.util.concurrent包中的ExecutorService接口及其实现类来实现。线程池的作用:○ 提高性能:线程池能够降低线程创建和销毁的开销,提高线程的重用率,从而提高应用程序的性能。○ 控制资源消耗:线程池能够限制同时运行的线程数量,避免因为线程过多导致系统资源不足,从而提高系统的稳定性。
2024-03-27 18:01:49 1145
原创 雪花算法介绍
Snowflake算法是Twitter开发的一种分布式唯一ID生成算法,用于解决在分布式系统中生成全局唯一ID的问题。该算法的核心思想是通过对64位的ID进行合理的位分配,保证在分布式环境下生成的ID具有全局唯一性和有序性。
2024-03-27 15:07:55 955
原创 redis分布式锁
锁我们都知道,在程序中的作用就是同步工具,保证共享资源在同一时刻只能被一个线程访问,Java中的锁我们都很熟悉了,像synchronized 、Lock都是我们经常使用的,但是Java的锁只能保证单机的时候有效,分布式集群环境就无能为力了,这个时候我们就需要用到分布式锁。3.使用带有唯一标识的锁:在设置锁时,可以为每个获取锁的客户端生成一个唯一的标识,释放锁时验证标识是否匹配,确保只有持有锁的客户端才能释放锁,避免其他客户端误操作导致的死锁。在这里,判断当前线程加的锁和释放锁是不是一个原子操作。
2024-03-27 14:24:02 1005
原创 分布式锁详解
1.Redis是基于它的命令执行是单线程的这个特性,所以在获取数据的时候不会有并发问题来去做分布式锁的,其中Redisson客户端,对分布式锁进行了很好的包装,redisson分布式锁 基于lua+hash来实现加锁逻辑,同时利用Redis的发布与订阅以及seamphore来实现锁的等待。2.zk的分布式锁,主要是基于zk的临时有序节点+watch机制来实现的,每个线程去尝试加锁都会创建一个临时有序节点,然后拿锁的时候,判断是否是最小的那几个节点,如果不是,就线程安全的去监听上一个节点。
2024-03-27 14:00:23 877
原创 Zookeeper实现分布式锁(Zk分布式锁)
基于zookeeper临时有序节点可以实现的分布式锁。1、zookeeper天生设计定位就是分布式协调,强一致性。锁的模型健壮、简单易用、适合做分布式锁。2、如果获取不到锁,只需要添加一个监听器就可以了,不用一直轮询,性能消耗较小。3、如果有较多的客户端频繁的申请加锁、释放锁,对于zk集群的压力会比较大。
2024-03-23 15:26:51 982
原创 分布式详解
分布式,通俗意义上来讲,分布式是将一个整体按照分布到不同地方,只要一个节点出现问题,则会导致系统出现问题,分布式就是将多台服务器集中在一起,每台服务器都实现总体中的不同业务。每台服务器都缺一不可,如果某台服务器发生宕机了,则部分功能缺失,将导致整体无法运行。
2024-03-23 14:56:17 981
原创 Zookeeper详解(zk)
部署的越多,可靠性就越高,当然只能部署奇数个,偶数个是不可以的(zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。同理,要是有3个zookeeper,一个死了,还剩下2个正常的,过半了,所以3个zookeeper的容忍度为1;但是,会带来Leader选举的一个问题,也就是说,如果Leader节点宕机了,为了保证集群继续提供可靠的服务,Zookeeper需要从剩下的Follower节点里面去选举一个新的节点作为Leader,也就是所谓的Leader选举。
2024-03-22 17:17:25 1162
原创 Dubbo详解
Dubbo 是一款开源的高性能分布式服务框架,由阿里巴巴集团开发和维护。它提供了一套完整的分布式服务治理解决方案,帮助用户轻松构建和管理大规模的分布式系统。服务注册与发现:Dubbo 提供了服务注册中心,用于集中管理服务的注册和发现。服务提供者在启动时将自己的服务注册到注册中心,服务消费者通过注册中心获取服务提供者的地址并进行调用。负载均衡:Dubbo 支持多种负载均衡策略,可以根据实际场景选择适合的负载均衡算法,以实现请求在服务提供者之间的均衡分发。
2024-03-22 15:42:22 946
原创 rpc详解rpc框架
在互联网应用开发中,随着业务的复杂度增加,一般都会采用分布式架构。分布式架构的核心,就是利用多台普通的计算机组成一个庞大的复杂计算网络,提供高并发、高性能、高可用的系统能力支撑。在分布式架构中,原本的单体应用服务被拆分成多个独立部署的服务,分布式在计算机网络上,这些服务必然,需要通过网络进行数据通信和交互。而RPC框架,就是解决在分布式架构中,各个服务之间的网络通信问题的框架。在Java应用中,JDK 1.1版本的时候就提供了对RPC的支持框架,叫做RMI。由于RMI不能实现跨域语言的远程调用。
2024-03-21 16:06:12 1401
原创 json详解
JSON 是一种轻量级的数据交换格式,它是基于 JavaScript 的一个子集,采用完全独立于编程语言的格式来表示数据,可以跨语言、跨平台使用。简洁清晰的层次结构使得 JSON 逐渐替代了 XML,成为了最理想的数据交换格式,广泛应用于 Web 开发领域。JSON 全称“JavaScript Object Notation”,译为“JavaScript 对象简谱”或“JavaScript 对象表示法”,是一种轻量级的、基于文本的、开放的数据交换格式。
2024-03-21 09:30:10 767
原创 OOM问题如何解决
oom 以及遇到这种情况怎么处理的,是否使用过日志分析工具 OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,当 JVM 因为没有足够的 内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error。
2024-03-18 13:46:06 855
原创 Netty优化
netty 是一种异步的、基于事件驱动的网络框架,它在高性能和可伸缩性方面表现出色。适当调整 I/O 线程池大小:I/O 线程池的大小应该根据系统资源和需求来适当调整。如果设置太小,可能会导致线程饥饿或阻塞;如果设置太大,可能会浪费系统资源。使用 Direct ByteBuffers:使用 Direct ByteBuffers 可以避免将内存从 JVM 移动到操作系统内核空间的额外复制,从而提高效率。压缩数据传输:可以使用压缩算法(如 gzip、Snappy)来减少数据传输量,从而提高性能。
2024-03-13 17:49:30 923
原创 Netty线程模型详解
Netty的线程模型采用了Reactor模式,即一个或多个EventLoop轮询各自的任务队列,当发现有任务时,就处理它们。Netty支持单线程模型、多线程模型和混合线程模型等多种线程模型。Reactor其实是在NIO多路复用的基础上提出的一个高性能IO设计模式。它的核心思想是把响应IO事件和业务处理进行分离,通过一个或者多个线程来处理IO事件。然后把就绪的事件分发给业务线程进行异步处理。Reactor模型有三个重要的组件:Reactor :把I/O事件分发给对应的Handler。
2024-03-13 17:13:37 1053
原创 Netty架构详解
Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。Netty 主要用来做网络通信,一般可以用来作RPC框架的通信工具、实现即时通讯系统以及实时消息推送系统等。Netty是一个异步事件驱动的网络应用程序框架用于快速开发可维护的高性能协议服务器和客户端。Netty是一个NIO客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。
2024-03-13 16:41:11 1175
原创 Netty详解-通俗易懂
Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。Netty 主要用来做网络通信,一般可以用来作RPC框架的通信工具、实现即时通讯系统以及实时消息推送系统等。Netty 是一个基于 Java NIO(New Input/Output)库的网络应用框架,它提供了一种易于使用的 API 来快速开发高性能、可靠的网络应用程序。
2024-03-13 14:58:43 1093
原创 Elasticsearch详解es
ES全称是Elastic Search,它是一个建立在全文搜索引擎库Lucene基础上的开源搜索和分析引擎。ES它本身具有分布式存储、检索速度快的特性。所以,我们经常会用它来实现全文检索的功能。Elastic官网对ES的定义已经不再是ElasticSearch这一个组件,而是指Elastic Stack生态。而Elastic Stack主要包括ElasticSearch、Logstash、Kibana,这三个经典组合也称之为ELK。ElasticSearch主。
2024-03-11 17:44:18 1047
原创 ElasticSearch深度分页问题如何解决
Elasticsearch 的深度分页问题是指在大数据集上进行大量分页查询时可能导致的性能下降和资源消耗增加的情况。这种情况通常发生在需要访问大量数据的情形下,比如用户进行长时间滚动查看或者需要遍历大量数据的操作。数据的大量跳过和读取:在深度分页查询中,Elasticsearch 需要跳过大量的文档记录才能到达目标页,这会导致大量的 IO 操作和资源消耗。分布式搜索的成本:在分布式环境下,合并和排序大量数据的成本会很高。数据热点:深度分页可能导致部分节点负载过高,增加了数据热点的风险。
2024-03-11 17:04:23 1567
原创 redis数据结构类型
只不过Redis的扩容机制跟HashMap有点不一样,Redis会有2个hashTable,第二个table只有再扩容的时候使用,当第一个table的容量达到一定量,这个量正常是已有的数据是table大小的时候就会扩容,但是当有在进行持久化的时候,使用量是table容量的5倍的时候扩容。比如可以通过 lrange 命令,读取某个闭区间内的元素,可以基于 list 实现分页查询,这个是很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高,就一页一页走。
2024-03-08 17:37:14 841
原创 Redis什么这么快和Redis单线程模型和多线程
1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;4、非阻塞IO多路复用机制。
2024-03-08 16:22:42 914
原创 RabbitMQ架构详解
RabbitMQ是⼀个高可用的消息中间件,支持多种协议和集群扩展。并且支持消息持久化和镜像队列,适用于对消息可靠性较高的场合官网https://www.rabbitmq.com/getstarted.html。
2024-03-08 15:47:37 1272
原创 RabbitMQ详解
RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然.RabbitMQ本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了一个经纪人(Broker)构架,这意味着消息在发送给客户端时先在中心队列排队。
2024-03-08 14:27:43 1168
原创 RabbitMQ如何实现消费端限流
在 RabbitMQ 中,可以通过消费者端限流(Consumer Prefetch)来控制消费端处理消息的速度,以避免消费端处理能力不足或处理过慢而导致消息堆积。消费者端限流的主要目的是控制消费者每次从 RabbitMQ 中获取的消息数量,从而实现消息处理的流量控制。RabbitMQ 提供了一种 QOS(服务质量保证)功能,即在非自动确认消息的前提下,如果一定数目的消息还未被消费确认,则不进行新消息的消费。RabbitMQ 为我们提供了三种机制● 对内存和磁盘使用量设置阈值。
2024-03-08 11:17:16 1430
原创 RabbitMQ事务机制和确认机制
1.1事务机制:发送消息前,开启事务(channel.txSelect()),然后发送消息,如果发送过程中出现什么异常,事务就会回滚(channel.txRollback()),如果发送成功则提交事务(channel.txCommit())。需要注意的是,事务机制会对性能产生一定的影响,因为它需要进行额外的操作来维护事务的一致性。使用事务机制时,可以在发送消息之前开启一个事务,在事务内发送消息并进行确认提交,以确保消息被正确地发送到 RabbitMQ 中。确认可以是单条消息的确认,也可以是批量消息的确认。
2024-03-08 10:15:05 1871 2
原创 实现消息队列(Kafka、ActiveMQ、RabbitMQ和RocketMQ)高可用
单机没有高可用可言,高可用都对集群来说的集群部署:将消息队列系统部署为集群,包含多个节点(Broker),节点之间可以相互备份和负载均衡。通过集群部署,可以提高系统的容错能力和可扩展性,确保在单个节点故障时系统仍能正常运行。数据复制:消息队列系统通常支持消息数据的复制机制,可以将消息数据同步到多个节点上,以实现数据的冗余存储和故障恢复。通过数据复制,可以保证即使某个节点发生故障,消息数据依然可靠地保存在其他节点上。
2024-03-07 17:25:05 1061
原创 MQ的消费模式-消息是推还是拉
MQ的消费模式可以大致分为两种,一种是推Push,一种是拉PullPush是服务端主动推送消息给客户端,Pull是客户端需要主动到服务端轮询获取数据。推优点是及时性较好,但如果客户端没有做好流控,一旦服务端推送大量消息到客户端时,就会导致客户端消息堆积甚至崩溃。拉优点是客户端可以依据自己的消费能力进行消费,但是频繁拉取会给服务端造成压力,并且可能会导致消息消费不及时。
2024-03-07 14:26:55 1178
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人