自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 sql相关优化问题

5.从索引入手,使用explain语句查看ref是否正确的使用到了索引,尽量做到索引覆盖,避免索引失效,删除无用索引。1.从MySQL的查询器优化器出发,避免select * 让MySQL查询优化器进行转化select A,B,C。1.id连续的情况下,使用子查询减少回表次数,获取需要查询结果的第一个id,作为条件来查询后面10条。4.从sql入手,避免复杂的join与子查询,使用最有效的过滤条件,小结果集驱动大结果集,排序等。3.从表结构出发,根据业务场景及常见需求,优化表结构设计,分离出常用的小表等。

2024-03-05 19:09:37 345 1

原创 数据一致性问题

4、不断消费mq,每费完一条消息,将消息写入到es中;(主要来源于mq消息的消费保障机制,比如es宕机或写入失败还能重新消费mq消息);1.先更新数据库,在更新缓存(可能会出现更新缓存时失败,导致缓存数据跟数据库数据不一致,而访问数据时都是先访问缓存的,会造成很大的影响)3、数据实时问题,mq是异步消费,用户输入,不一定会马上同步让他看到。1、硬编码,有mysql写入,就要写写入es的代码。1、硬编码,接入新的数据源需要实现新的消费者代码;2、没有业务强耦合,不改变原来程序的性能;

2024-03-05 16:23:55 329

原创 RabbitMQ

如何保证消息队列的消息不丢失:1.生产者角度RabbitMQ提供事务机制(transaction)和确认机制(confirm)两种模式来确保生产者不丢消息。(1)事务机制: 发送消息前,开启事务(channel.txSelect()),然后发送消息,如果发送过程中出现什么异常,事务就会回滚(channel.txRollback()),如果发送成功则提交事务(channel.txCommit()) 该方式的缺点是生产者发送消息会同步阻塞等待发送结果是成功还是失败

2024-03-05 14:08:58 364

原创 Nacos

通常我们说,Nacos技能保证CP,也能保证AP,具体看如何配置,但其实只不过是Nacos中的注册中心能保证CP或AP,Nacos中的配置中心其实没什么CP或AP,因为配置中心的数据是存在一个Mysql中的,只有注册中心的数据需要进行集群节点之间的同步,从而涉及到是CP还是AP,如果注册的节点是临时节点,那么就是AP,如果是非临时节点,那么就是CP,默认是临时节点。优点:减少网络通讯中的数据包的大小,吧一次大数据包的通信拆分多个小数据的通信,虽然提高了网络传输次数,但是提高了整体的数据传输的性能。

2024-03-04 19:31:16 334

原创 Elasticsearch

倒排索引:存储数据时将关键词和数据进行关联,保存到倒排表中,然后查询时,将查询内容进行分词后在倒排表中进行查询,最后匹配数。4.binlog:利用数据库的binlog日志,使用canal这种中间件完成。1.同步调用,在代码块里面增加逻辑,在增删改查的同时往ES进行同样的操作。3.logstash:定期查询数据库,进行数据同步。2.MQ:监听MQ,实现数据同步。

2024-03-02 18:07:11 350

原创 openfigen

在其invoke()方法中,会根据Java反射的方法实例,在dispatch 映射对象中找到对应的 MethodHandler 方法处理器,然后由后者完成实际的HTTP请求和结果的处理。当我们项目启动时,会通过@EnableFeignClients(basePackages = "com.xxx.xxx")扫描相应包路径下的feignClient,然后使用动态代理技术生成代理类注入到spring容器之中,这样当我们使用feign接口方法发起远程调用,其实就是使用生成的动态代理类去实现请求。

2024-03-02 17:12:25 361

原创 Sentinel

集群限流:通过token server跟token client进行限流,有client向server发送请求,server根据配置的规则决定是否限流。核心:@SentinelResource(value="规则",blockHandler="失败的方法")基于时间窗口算法,动态的调整窗口的大小跟滑动步长,更加精准的控制限流。QPS跟并发线程数俩种基础策略规则 进行限流。限流算法:滑动窗口算法。

2024-02-25 21:17:00 366

原创 订单相关问题思路

3.AOP 防重复提交注解 将请求体使用MD5加密变成字符串,使用Redis存储,setnx命令,一定时间内无法插入的数据则视为重复提交。6.使用悲观锁,在innoDB下,使用for update语句对库存进行行锁。5.库存存储在Redis,使用decr命令进行处理,失败时则库存为0。1.前端防抖动,且下单后重定向到其他页面,执行当前订单的查询功能。2.使用token,相同token的请求被直接返回。6.使用乐观锁,添加version字段,进行校验。4.使用分布式锁,对库存处理步骤进行加锁。

2024-02-25 21:10:17 374

原创 设计模式简述

为什么不直接对getSingleton方法使用synchronized关键字:如果直接对方法使用synchronized关键字,虽然可以达到效果,但是锁的粒度过于大,而且可能中间还存在很多的逻辑处理2。饿汉模式:类加载时创建(不存在线程安全问题 但是会影响项目启动时间)1.单例模式:单例对象的类必须只有一个实例存在。2.线程安全版本(DCL模式 多重检测锁)//可能存在的逻辑处理。懒汉模式:使用时加载。

2024-02-23 17:00:17 397

原创 分布式事务

一阶段:Seata拦截sql进行解析,然后在数据更新前,将数据写入undo日志,在执行SQL成功后,将更新的数据写入redo日志,在本地数据库事务内完成。准备阶段:事务管理器发送prepare消息,参与者在本地进行事务执行,写入uodo/redo日志,但并不提交。consistency 一致性:执行事务前后数据将保持一致性,不同事务对一个数据的读取结果是一样的。提交阶段:如果事务管理器收到参与者的失败消息,则回滚,如果成功,则参与者提交事务。:侵入性大 需要自己手动去进行回滚 ,但是没有锁,性能强。

2024-01-02 12:30:38 361

原创 分布式锁相关

增加lock表,并将锁名作为唯一索引,当进程开始时,向lock表中插入数据,成功则代表获得锁,执行方法,执行完毕后释放锁(删除数据),失败则代表无法获得锁,只能进行重试。当进程开始时,向Redis中插入数据(需要设置时间,防止出现死锁现象),成功则获得锁,执行方法,执行完毕后释放锁(删除数据),失败则代表无法获得锁,只能进行重试。根据id进行分段的一种操作,如数据库种id为1-10的数据,使用Redis中可用为id-1的锁,10-20使用Redis中id-2的锁,进行一种分段操作。

2023-12-29 19:50:19 319 1

原创 Duboo

用户量的激增,导致系统压力过大,所以产生了分布式系统,将系统按照业务进行拆分,减轻压力,增加代码的复用,因为服务的越来越多,调用关系越来越复杂,所以最后产生了dubbo,对各个层面的服务进行解耦,完善治理方案。RPC:分布式系统中实现进程间通信(IPC)的技术 更像是服务器与服务器之间的通信 让他们之间的通信达到本地调用一样的感觉,传输效率高,性能消耗低,服务治理方便。3.单一视图:客户端连接集群中的任一zk节点,数据都是一致的。HTTP:应用层协议 互联网交换数据的常用协议,更加面向互联网。

2023-12-29 00:18:56 322 1

原创 Keepalived+Nginx 实现集群

notify_master /etc/keepalived/to_master.sh # 指定当切换到 master 时,执行的脚本,即切换到 master 时要将 backup 的 server 关掉。router_id nginx01 # router_id 机器标识,通常使用 hostname,相对具有唯一性,和备机区分开,不能使用同一个标识。vrrp_instance VI_1 { # 定义一个vrrp_install实例,名称为VI_1。

2023-12-28 20:21:07 1749 1

原创 跨域问题相关

跨域问题本质:浏览器无法执行其他网站的脚本,是浏览器对js脚本的安全策略,是由于游览器的同源策略规定的(协议,域名,端口都要一致)1.nginx代理:nginx代理模式,所有的请求都会先交给nginx,nginx进行代理,然后将其再发给网关,然后网关在去转给对应服务2配置当次请求容许跨越:因为所有的请求都会先发送预检请求,所有我们可以告诉这次请求可以进行跨域访问,及添加响应头进行配置...

2021-11-10 21:13:59 2563

原创 SpringCloud

1.Nacos:注册中心2.Openfeign:远程调用服务3.Ribbon:负载均衡 三种算法:轮询 权重 随机4.Hystrix 熔断 隔离 降级5.Zuul:网关

2021-10-28 21:25:39 87

原创 Redis

1.非关系型数据库支持的数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列表)、Zset(有序集合)2.为什么使用RedisRedis的数据是存储在内存中,所有读写性能优异 高性能:用户第一次从硬盘读取数据后,将访问的数据存在缓存中,这样在下一次用户访问时就会直接从缓存中获得数据,获取速度大大加快 高并发:操作缓存的承受是大于访问数据库,避免出现高并发情况,减少数据库压力 支持数据持久化,支持AOF和RDB俩种持久化方式 数据结构丰富而简单,支持多

2021-09-28 14:31:08 129 1

原创 Spring

Spring核心组成模块: 1.spring core:提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)功能 2.spring beans:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean 3.spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法...

2021-09-08 14:44:51 96

原创 MYSQL相关

三大范式1.每个列都不可以被拆分2.非主键列必须完全依赖于主键3.非主键列不能依赖其他非主键三大范式的存在保证了数据的原子性,数据必须且只能跟主键有直接的关系MyISAM引擎和InnoDB引擎MyISAM:查询速度更优,但是不支持事务,不支持行级锁和外键,使用聚簇索引InnoDB:写入速度更优,支持事务,行级锁以及外键,使用非聚簇索引,主键索引和覆盖索引速度很高效InnoDB四大特性1.插入缓冲2.二次写3.自适应哈希索引3.预读索引一种数

2021-09-02 18:01:29 102

原创 JVM相关

JVM:java虚拟机,java可以跨平台的原因JVM内存结构:程序计数器:记录当前线程执行到哪一条字节码指令位置虚拟机栈:线程执行方法的时候内部存局部变量会存堆中对象的地址等等数据本地方法栈:存放各种native方法的局部变量表之类的信息Java堆:对象,静态变量,共享方法区:存放类信息,运行时常量池,共享。java8移...

2021-09-01 16:24:03 114

原创 IO与网络编程

io流输入流:InputStream,FileInputStream,ByteArrayInputStream,BufferedInputStream,Reader,FileReader,BufferedReader输出流:OutputStream,FileOutputStream,ByteArrayOutputStream,BufferedOutputStream,Writer,FileWriter,BufferedWriterBIO,NIO和AIOBIO:blocking-io,同步

2021-09-01 14:07:07 159

原创 线程池相关

线程池:用于管理线程的工具优点: 降低资源消耗。通过重复利用已创建的线程,降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 增加线程的可管理型。线程是稀缺资源,使用线程池可以进行统一分配,调优和监控。 核心属性:threadFactory(线程工厂):用于创建工作线程的工厂corePoolSize(核心线程数):当线程池运行的线程少于 corePoolSize 时,将创建一个新线程来处理请求,即使其他工作线程处于空

2021-08-31 18:03:07 152

原创 java 锁

乐观锁跟悲观锁乐观锁:在每次操作时,都认为不会对数据进行修改操作,所以不对数据进行上锁。因此多用于读操作很多的地方,不需要进行上锁,提高吞吐量悲观锁:在每次操作时,都认为会对数据进行修改操作,所以对数据都进行上锁,保证了数据的安全性(即一个进程在修改数据时,其他进程无法对该数据进行操作)公平锁跟非公平锁公平锁:多个线程在等待同一个锁时,必须按照申请锁的先后顺序来一次获得锁非公平锁:多个线程在等待同一个锁时,不会按照申请锁的先后顺序来获得锁优劣:公平锁保证了每个线程都能获得锁,但是

2021-08-31 15:35:49 103

原创 HashMap相关

1.键对值存储方式2.存储形式:1.8之后采用“数组+链表+红黑树”,1.7采用“数组+链表”3.存取方式:1.7头插法:即当你插入一个新的key-value值时,会先对key值进行hash运算(key.hashcode()),如果返回值相同,那么他们的存储位置相同的。此时使用equals方法去比较Entry的key值,如果返回值为true,则用新的value值去覆盖旧的,如果返回值我false,则将其Entry和原来的Entry形成链结构并插入头部(以新的值为头形成链表)1.8尾插法:与头

2021-08-31 14:52:53 98

原创 ArrayList相关

1.底层实现:底层使用数据实现,Object[] elementData2.特点:顺序排序,查询速度快,插入,删除速度慢(顺序删除速度慢,随机删除速度快)3.查询原理:查询时,根据输入的index值进行快速定位查询4.插入,删除原理:以新增为例,当在index位插入新的元素,ArrayList会复制index+1位后面的所有元素,然后将元素按顺序插入到index+1位后面,实现元素的插入,删除同理,即是覆盖操作,所以相对于LinkedList插入删除速度较慢。但是在随机插入时,则无需考虑这么多,

2021-08-31 10:58:36 136

原创 JAVA基础

1.面向对象的三大特征继承:子类继承父类的特征和行为,让子类对象具有父类的方法和行为封装:隐藏对象的属性和实现细节,对数据的访问只能通过外公开的接口,一种对内部数据的保护行为多态:对于同一个行为,不同的子类对象具有不同的表现形式存在条件:1.继承 2.重写3.父类引用指向子类对象2.重写跟重载重写:子类继承父类,他具有父类的所有方法和行为,但是他可以对父类的方法进行修改,以增加功能。规则:1.子...

2021-08-30 17:37:17 724

空空如也

空空如也

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

TA关注的人

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