- 博客(80)
- 收藏
- 关注
原创 快照读和当前读
当前读读取的是记录的最新版本(最新数据,而不是历史版本的数据),读取时需要保证其他并发事务不能修改当前记录,所以会对读取的记录进行加锁。快照读 即:snapshot read,官方叫法是:Consistent Nonlocking Reads,即:一致性非锁定读,官方的解释是 :InnoDB 通过 MVCC(多版本控制)将数据库在过去某个时刻的快照应用在查询上,使得:这次查询 只能看到 别的事务在生成快照前提交的数据,而不能看到 别的事务在生成快照后提交的数据或者未提交的数据。update(排他锁)
2023-08-23 17:48:57
339
原创 spring aop代理
而在这个方法中,遍历了所有的BeanPostProcessor,并且调用了BeanPostProcessor的后置处理方法postProcessAfterInitialization。initializeBean——————>doCreateBean——>createBean——>doGetBean——>getBean——>preInstantiateSingletons——>finishBeanFactoryInitialization——>refresh——>构造方法。
2022-12-08 22:42:59
143
1
原创 MySQL日志(redo log、binlog)刷盘策略
write(刷盘)指的是MySQL从buffer pool中将内容写到系统的page cache中,并没有持久化到系统磁盘上。取值0:每次提交都将binlog 从binlog cache中 write到磁盘上,而不fsync到磁盘。取值N:每次提交事务都将binlog write到磁盘上,累计N个事务之后,执行fsync。取值1:每次提交事务都将redo log 持久化到磁盘上,也就是write+fsync。取值1:每次提交事务都将binlog fsync到磁盘上。fsync:持久化到磁盘。
2022-10-27 18:54:40
962
原创 秒杀系统设计
秒杀系统设计1系统初始化,把商品库存数量加载到Redis2收到请求,Redis预减库存,库存不足,直接返回(lua脚本判断库存扣减库存),否则进入3。这一步还可以有一个优化,就是内存标记,使用一个Map,将商品ID设置为false,当买空时,设为true;然后每次不是直接访问Redis进行库存查询,而是对商品ID进行条件判断3请求入队,立即返回排队中(异步下单)4请求出队,生成订单,减少库存,把订单写入Redis中5客户端轮询,判断是否秒杀成功...
2021-11-15 07:34:59
546
原创 java反射
反射:其实就是动态的从内存加载一个指定的类,并获取该类中的所有的内容。反射的好处:大大的增强了程序的扩展性。反射的基本步骤: 1. 获得Class对象,就是获取到指定的名称的字节码文件对象。 2. 实例化对象,获得类的属性、方法或构造函数。 3. 访问属性、调用方法、调用构造函数创建对象。一: 获取Class对象,有三种方式 : 1:通过每个对象都具备的方法getClass来获取。弊端:必须要创建该类对象,才可以调用getClass方法。 2:每一个数据类型(基本数据类型和引用数
2021-11-14 10:51:58
85
原创 RPC相关
RPC 涉及序列化、压缩算法、协议、动态代理、服务注册、加密、网络编程、连接管理、健康检测、负载均衡、优雅启停机、异常重试、业务分组以及熔断限流等方方面面
2021-11-14 10:39:53
1255
原创 Spring Cloud Zuul
Spring Cloud Zuul 是 Spring Cloud Netflix 子项目的核心组件之一,可以作为微服务架构中的 API 网关使用,支持动态路由与过滤功能API 网关为微服务架构中的服务提供了统一的访问入口,客户端通过 API 网关访问相关服务。API 网关的定义类似于设计模式中的门面模式,它相当于整个微服务架构中的门面,所有客户端的访问都通过它来进行路由及过滤。它实现了请求路由、负载均衡、校验过滤、服务容错、服务聚合等功能。路由与过滤是Zuul的两大核心功能,路由功能负责将外部请求
2021-11-13 18:16:44
209
原创 Eureka
Eureka Server:注册中心服务端注册中心服务端主要对外提供了三个功能:服务注册服务提供者启动时,会通过 Eureka Client 向 Eureka Server 注册信息,Eureka Server 会存储该服务的信息,Eureka Server 内部有二层缓存机制来维护整个注册表提供注册表服务消费者在调用服务时,如果 Eureka Client 没有缓存注册表的话,会从 Eureka Server 获取最新的注册表同步状态Eureka Client 通过注册、心跳机制和 Eure
2021-11-13 16:18:20
87
原创 Feign负载均衡 Hystrix熔断器
feign负载均衡--------------feign 是基于Ribbon负载均衡的实现,Feign对Ribbon进行了封装。使用了JDK动态代理请求时长和请求机制 -yml因为是封装了ribbon所以他有负载均衡的能力 他的依赖里面也有ribbonFegin内置的ribbon默认设置了请求超时时长,默认是1000ms,我们可以通过手动配置来修改这个超时时长ribbon:ReadTimeout: 2000 # 读取超时时长ConnectTimeout: 1000 # 建立链接的超时时长1
2021-11-13 15:54:20
967
原创 CAP理论,BASE理论
CAP理论,BASE理论Consistency (一致性):即更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致。对于客户端来说,一致性指的是并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。Availability (可用性):即服务一直可用,而且是正常响应时间。系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。Partition Tolerance (分区容错性):即分布式系统在遇到某节点或网络
2021-11-11 20:28:47
118
原创 Linux常用命令
tailf name.log 查看日志less [filename] 显示文件内容vim xxx.file 然后按 “i” 字母进入编辑模式 按 ESC,左下角就可以进行输入:w 保存但不退出:wq 保存并退出:q 退出:q! 强制退出,不保存pwd 显示当前工作目录ls 列出指定目录内容cp 拷贝mv 移动文件/目录, 文件/目录改名mkdir 建立目录rm 删除文件/目录chmod 更改文件/目录权限ps 显示瞬间进程执行状况ifconfig 查询、配置网络设备, 可设置网
2021-11-10 21:20:59
958
原创 java动态代理
代理模式代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。为了对外开放协议,B往往实现了一个接口,A也会去实现接口。但是B是“真正”实现类,A则比较“虚”,他借用了B的方法去实现接口的方法。A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。Spring AOP就是使用了动态代理完成了代码的动态“织入”。使用代理好处还不止这些,一个工程如果依赖另一个工程给的接口,但是另一个工程的接口不稳定,经常变更协议,就可以使用一个代理,接口变更时,只
2021-11-09 20:29:33
258
原创 java设计模式
设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结设计模式分为 23 种经典的模式,根据用途我们又可以分为三大类。分别是创建型模式、结构型模式和行为型模式列举几种设计原则,这几种设计原则将贯通全文:面向接口编程,而不是面向实现。这个尤为重要,也是优雅的、可扩展的代码的第一步,这就不需要多说了吧职责单一原则。每个类都应该只有一个单一的功能,并且该功能应该由这个类完全封装起来对修改关闭,对扩展开放。对修改关闭是说,我们辛辛苦苦加班写出来的代码,该实现的功能和该修复的 bug 都完成了,别人可不
2021-11-09 19:34:42
215
原创 RabbitMQ死信队列、延时队列
RabbitMQ死信队列、延时队列消息被消费方否定确认,使用 channel.basicNack 或 channel.basicReject ,并且此时requeue 属性被设置为 false 。消息在队列的存活时间超过设置的TTL时间。消息队列的消息数量已经超过最大队列长度。那么该消息将成为“死信”。“死信”消息会被RabbitMQ进行特殊处理,如果配置了死信队列信息,那么该消息将会被丢进死信队列中,如果没有配置,则该消息将会被丢弃为每个需要使用死信的业务队列配置一个死信交换机,这里同一个项
2021-11-07 09:47:42
128
原创 RabbitMQ事务消息
RabbitMQ事务消息通过对信道的设置实现channel.txSelect();通知服务器开启事务模式;服务端会返回Tx.Select-Okchannel.basicPublish;发送消息,可以是多条,可以是消费消息提交ackchannel.txCommit()提交事务;channel.txRollback()回滚事务;消费者使用事务:autoAck=false,手动提交ack,以事务提交或回滚为准;2.autoAck=true,不支持事务的,也就是说你即使在收到消息之后在回滚事务也是
2021-11-07 09:35:35
1820
原创 RabbitMQ如何确保消息发送 ? 消息接收?
RabbitMQ如何确保消息发送 ? 消息接收?发送方确认机制:信道需要设置为 confirm 模式,则所有在信道上发布的消息都会分配一个唯一 ID。一旦消息被投递到queue(可持久化的消息需要写入磁盘),信道会发送一个确认给生产者(包含消息唯一ID)。如果 RabbitMQ发生内部错误从而导致消息丢失,会发送一条nack(未确认)消息给生产者。所有被发送的消息都将被 confirm(即ack)或者被nack一次。但是没有对消息被confirm 的快慢做任何保证,并且同一条消息不会既被 conf
2021-11-07 09:34:50
1426
原创 简述RabbitMQ的架构设计
先我们肯定知道RabbitMQ就是消息队列的一种实现,那么围绕这个,我们就可以思考一个消息队列到底需要什么,当然是需要队列,那么这个队列就是Queue,那么其他的所有名词都是围绕这个Queue来拓展的。首先,想要让队列不在本地运行,而在网络中运行,肯定会有连接这个概念,所以就会有Connection,我们发一条消息连接一次,这样很显然是浪费资源的,建立连接的过程也很耗时,所以我们就会做一个东西让他来管理连接,当我用的时候,直接从里边拿出来已经建立好的连接发信息,那么ConnectionFactory应运.
2021-11-06 16:57:29
1247
原创 事务的基本特性和隔离级别
事务的基本特性和隔离级别事务基本特性ACID分别是:原子性指的是一个事务中的操作要么全部成功,要么全部失败。一致性指的是数据库总是从一个一致性的状态转换到另外一个一致性的状态。比如A转账给B100块钱,假设A只有90块,支付之前我们数据库里的数据都是符合约束的,但是如果事务执行成功了,我们的数据库数据就破坏约束了,因此事务不能成功,这里我们说事务提供了一致性的保证隔离性指的是一个事务的修改在最终提交前,对其他事务是不可见的。持久性指的是一旦事务提交,所做的修改就会永久保存到数据库中。隔离性有4个
2021-11-05 17:14:47
102
原创 TCP原理
1.什么是TCPTCP是一种面向连接、可靠、基于字节流的传输协议,属于5层或者7层网络协议中的传输层协议;面向连接:不同于UDP,TCP协议需要通信双方确定彼此已经建立连接后才可以进行数据传输;可靠:连接建立的双方在进行通信时,TCP保证了不会存在数据丢失,或是数据丢失后存在拯救丢失的措施;字节流:实际传输中,不论是何种数据,TCP都按照字节的方式传输,而非以数据包为单位。TCP数据包格式端口号:用于区分发送消息或者接收消息的进程。序号:首字节在整个数据流中的位置。初始序列号随机产生,并在连
2021-11-05 09:07:59
365
原创 Kafka在什么情况下会出现消息丢失及解决方案
Kafka在什么情况下会出现消息丢失及解决方案?ACK应答机制可以在生产者向队列写入数据的时候可以设置参数来确定是否确认kafka接收到数据,这个参数可设置的值为0、1、2、…all。 0代表producer往集群发送数据不需要等到集群的返回,不确保消息发送成功。安全性最低但是效率最高。 1代表producer往集群发送数据只要leader应答就可以发送下一条,只确保leader发送成功。2代表producer往集群发送数据需要至少一个follower都完成从leader的同步才会发送下一条,
2021-11-04 18:56:19
362
原创 kafka架构
Producer:Producer即生产者,消息的产生者,是消息的入口。kafka cluster: kafka集群 Broker:Broker是kafka实例,kafka集群的一个节点,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器。每个kafka集群内的broker都有一个不重复的编号,如图中的broker-0、broker-1等…… Topic:可以理解为一个队列,Topic将消息分类,生产者和消费者面向的是同一个Topic,kafka的数据就.
2021-11-04 16:08:38
492
原创 缓存雪崩、缓存穿透、缓存击穿
缓存雪崩、缓存穿透、缓存击穿缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。解决方案:缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。给每一个缓存数据增加相应的缓存标记,记录缓存是否失效,如果缓存标记失效,则更新数据缓存。缓存预热互斥锁缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。解决方案:接口层增加校验,如用户鉴权校验,id做基础校验,id<=0
2021-11-04 09:54:36
90
原创 redis 主从复制的核心原理
redis 主从复制的核心原理通过执行slaveof命令或设置slaveof选项,让一个服务器去复制另一个服务器的数据。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。全量复制:(1)主节点通过bgsave命令fork子进程进行RDB持久化,该过程是非常消耗CPU、内存(页表复制)、硬盘IO的(2)主节点通过网络将RDB文件发送给从节点,对主从节点的
2021-11-04 09:51:23
152
原创 redis集群
主从复制模式主从复制模式中包含一个主数据库实例(master)与一个或多个从数据库实例(slave)客户端可对主数据库进行读写操作,对从数据库进行读操作,主数据库写入的数据会实时自动同步给从数据库。具体工作机制为: 1、slave启动后,向master发送SYNC命令,master接收到SYNC命令后通过bgsave保存快照(RDB持久化),并使用缓冲区记录保存快照这段时间内执行的写命令2、master将保存的快照文件发送给slave,并继续记录执行的写命令3、slave接收到快照文件后,加载快照
2021-11-04 09:49:20
151
原创 简述Redis事务实现
简述Redis事务实现1、事务开始MULTI命令的执行,标识着一个事务的开始。MULTI命令会将客户端状态的 flags 属性中打开REDIS_MULTI 标识来完成的。2、命令入队当一个客户端切换到事务状态之后,服务器会根据这个客户端发送来的命令来执行不同的操作。如果客户端发送的命令为MULTI、EXEC、WATCH、DISCARD中的一个,立即执行这个命令,否则将命令放入一个事务队列里面,然后向客户端返回 QUEUED 回复如果客户端发送的命令为 EXEC、DISCARD、WATCH、MUL
2021-11-04 09:48:08
315
原创 Redis线程模型、单线程快的原因
Redis线程模型、单线程快的原因Redis基于Reactor(反应器)模式开发了网络事件处理器,这个处理器叫做文件事件处理器 file event handler。这个文件事件处理器,它是单线程的,所以Redis才叫做单线程的模型,它采用IO多路复用机制来同时监听多个Socket,根据Socket上的事件类型来选择对应的事件处理器来处理这个事件。可以实现高性能的网络通信模型,又可以跟内部其他单线程的模块进行对接,保证了Redis内部的线程模型的简单性。文件事件处理器的结构包含4个部分:多个Socket
2021-11-04 09:46:37
134
原创 Redis的过期键的删除策略
Redis的过期键的删除策略Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。对于过期键一般有三种删除策略定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作;惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,那就返回该键;定期删除:每隔一段时间,程序
2021-11-04 09:44:23
126
原创 RDB、AOF
RDB:Redis DataBase在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。优点:1、整个Redis数据库将只包含一个文件 dump.rdb,方便持久化。2、容灾性好,方便备份。3、性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能4.相对于数据集大时,比 AO
2021-11-04 09:43:35
104
原创 JAVA线程锁机制是怎样的
三、JAVA线程锁机制是怎样的?偏向锁、轻量级锁、重量级锁有什么区别?锁机制是如何升级的?1、java的锁就是在对象的Markword中记录一个锁状态。无锁、偏向锁、轻量级锁、重量级锁对应不同的锁状态。2、java的锁机制是根据资源竞争的激烈程度不断进行锁升级的过程。3、过程:先导包` <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</ar
2021-11-02 22:47:47
272
原创 mysql执行计划怎么看
mysql执行计划怎么看执行计划就是sql的执行查询的顺序,以及如何使用索引查询,返回的结果集的行数EXPLAIN SELECT * from A where X=? and Y=?1。id :是一个有顺序的编号,是查询的顺序号,有几个 select 就显示几行。id的顺序是按 select 出现的顺序增长的。id列的值越大执行优先级越高越先执行,id列的值相同则从上往下执行,id列的值为NULL最后执行。2。selectType 表示查询中每个select子句的类型SIMPLE: 表示此查询
2021-10-24 19:54:38
278
原创 mysql主从同步原理
mysql主从同步原理mysql主从同步的过程:Mysql的主从复制中主要有三个线程: master(binlog dump thread)、slave(I/O thread 、SQLthread) ,Master一条线程和Slave中的两条线程。主节点 binlog,主从复制的基础是主库记录数据库的所有变更记录到 binlog。binlog 是数据库服务器启动的那一刻起,保存所有修改数据库结构或内容的一个文件。主节点 log dump 线程,当 binlog 有变动时,log dump 线程读取
2021-10-24 19:37:38
83
原创 慢sql优化
在业务系统中,除了使用主键进行的查询,其他的都会在测试库上测试其耗时,慢查询的统计主要由运维在做,会定期将业务中的慢查询反馈给我们。慢查询的优化首先要搞明白慢的原因是什么?是查询条件没有命中索引?是load了不需要的数据列?还是数据量太大?所以优化也是针对这三个方向来的,首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写。分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命
2021-10-24 19:37:00
60
原创 mysql中索引类型及对数据库的性能的影响
mysql中索引类型及对数据库的性能的影响普通索引:允许被索引的数据列包含重复的值。唯一索引:可以保证数据记录的唯一性。主键:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。联合索引:索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引。全文索引:通过建立倒排索引,可以极大的提升检索效率,解决判断字段是否包含的问题,是目前搜索引擎使用的一种关键技术。可以通过ALTER TABLE table_na
2021-10-24 19:06:57
310
原创 简述MyISAM和InnoDB的区别
简述MyISAM和InnoDB的区别MyISAM:不支持事务,但是每次查询都是原子的;支持表级锁,即每次操作是对整个表加锁;存储表的总行数;一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。InnoDb:支持ACID的事务,支持事务的四种隔离级别;支持行级锁及外键约束:因此可以支持写并发;不存储总行数;一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作
2021-10-24 19:05:11
131
原创 什么是MVCC
什么是MVCC多版本并发控制:读取数据时通过一种类似快照的方式将数据保存下来,这样读锁就和写锁不冲突了,不同的事务session会看到自己特定版本的数据,版本链MVCC只在 READ COMMITTED 和 REPEATABLE READ两个隔离级别下工作。其他两个隔离级别够和MVCC不兼容, 因为 READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而 SERIALIZABLE 则会对所有读取的行都加锁。聚簇索引记录中有两个必要的隐藏列:trx_id:用来存储每
2021-10-24 18:41:31
145
原创 ACID靠什么保证的
ACID靠什么保证的A原子性由undo log日志保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的sqlC一致性由其他三大特性保证、程序代码要保证业务上的一致性I隔离性由MVCC来保证D持久性由内存+redolog来保证,mysql修改数据同时在内存和redo log记录这次操作,宕机的时候可以从redo log恢复InnoDB redo log 写盘,InnoDB 事务进入 prepare 状态。如果前面 prepare 成功,binlog 写盘,再继续将事务日志持久化到 bin
2021-10-24 18:40:30
443
原创 锁的类型有哪些
锁的类型有哪些基于锁的属性分类:共享锁、排他锁。基于锁的粒度分类:行级锁(INNODB)、表级锁(INNODB、MYISAM)、页级锁(BDB引擎 )、记录锁、间隙锁、临键锁。基于锁的状态分类:意向共享锁、意向排它锁共享锁(Share Lock)共享锁又称读锁,简称S锁;当一个事务为数据加上读锁之后,其他事务只能对该数据加读锁,而不能对数据加写锁,直到所有的读锁释放之后其他事务才能对其进行加持写锁。共享锁的特性主要是为了支持并发的读取数据,读取数据的时候不支持修改,避免出现重复读的问题。排他锁(
2021-10-24 18:38:53
1765
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人