自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MapStrust使用

更优雅的给对象映射赋值。

2023-03-08 11:53:19 253 1

原创 Redis实践优化

如果没有密码和采用默认端口,容易让黑客利用Redis先保存数据在内存,然后持久化到服务器,接着config set到对应目录,ssh连接相关目录下的公钥,则无密码操作服务器,很危险。优点:更节省内存,key是string类型,底层编码包含int、embstr和raw三种。embstr在小于44字节使用,采用连续内存空间,内存占用更小。Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10,000个。Key本身的数据量过大:一个String类型的Key,它的值为5MB。要永久启用,修改配置文件。

2022-09-20 23:08:32 345

原创 Redis持久化

也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。完成fork后读取内存数据并写入RDB文件。Redis也会在触发阈值时自动去重写AOF文件。AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。都会记录在AOF文件,可以看做是命令日志文件。bgsave开始时会。

2022-09-18 22:04:25 306

原创 优惠劵秒杀优化-分布式锁

当我们去设置了多个锁时,redission 会将多个锁添加到一个集合中,然后用 while 循环去不停去尝试拿锁,但是会有一个总共的加锁时间,这个时间是用需要加锁的个数 * 1500ms ,假设有 3 个锁,那么时间就是 4500ms,假设在这 4500ms 内,所有的锁都加锁成功, 那么此时才算是加锁成功,如果在 4500ms 有线程加锁失败,则会再次去进行重试。这个方法,如果插入 key 成功,则表示获得到了锁,如果有人插入成功,其他人插入失败则表示无法获得到锁,利用这套逻辑来实现分布式锁。

2022-09-16 16:32:57 679

原创 主从数据一致性

首先我们将多个节点共同组成一个复制组,在 执行读写(RW)事务 的时候,需要通过一致性协议层(Consensus 层)的同意,也就是读写事务想要进行提交,必须要经过组里“大多数人”(对应 Node 节点)的同意,大多数指的是同意的节点数量需要大于(N/2+1),这样才可以进行提交,而不是原发起方一个说了算。并发差,如果有多个从库,要等所有从库都发送ack才能保证数据强一致性,如果只有一部分发送ack,主库就返回客户端,还有有可能造成主从数据不一致。进行主从同步的内容是二进制日志,它是一个文件,在进行。...

2022-08-29 10:47:11 205

原创 binlog格式设置

不记录每条sql语句的上下文信息,仅记录哪条数据被修改了,修改成什么样了。就是你插入5条数据,RBR会记录五条数据,而SBR只会记录一条插入数据的sql。MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。这也是系统不允许我们创建函数的原因,从服务器执行时间函数,复制的数据会不一样。在Mixed模式下,...

2022-08-29 09:27:58 644

原创 Mysql其他日志

可以先看Event_type,三个Write_rows,一个Update_rows,一个Delete_rows,就是对应我们刚刚的更新SQL,BEGIN到COMMIT是一个完整的事件,我们基于Pos去恢复。并不会回滚事务,它会执行上图框住的逻辑,虽然redo log是处于prepare阶段,但是能通过事务id找到对应的binlog日志,所以MySQL认为是完整的,就会提交事务恢复数据。的架构,把二进制日志文件的内容通过中继日志,同步到从数据库服务器中,这样就可以有效避免数据库故障导致的数据异常等问题。...

2022-08-28 15:47:16 447 1

原创 InnoDB多版本并发控制MVCC

MVCC是通过数据行的多个版本管理来实现数据库的 并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。

2022-08-24 23:50:41 199

原创 Mysql锁

锁机制为实现MySQL 的各个隔离级别提供了保证。锁冲突也是影响数据库并发访问性能的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。

2022-08-24 14:59:04 262

原创 Mysql事务日志

注意,redo log buffer刷盘到redo log file的过程并不是真正的刷到磁盘中去,只是刷入到 文件系统缓存(page cache)中去(这是现代操作系统为了提高文件写入效率做的一个优化),真正的写入会交给系统自己来决定(比如page cache足够大了)。因为事务提交后,要把数据写入磁盘,写入一半时宕机的话,如果没有redo日志,则会丢失掉一部分数据,有了redo日志则会记录要修改成什么,重启Mysql后可以借助redo.file去完成未修改成功的部分事务,保证事务的持久性。...

2022-08-18 23:38:57 222

原创 Mysql事务

此时的数据是不一致的,为什么呢?长事务第一次读取值,第二次再读取时,值被短事务提交修改过了(短事务已经完成状态),两次读取的值不一致。但是这样对 性能影响太大 ,我们既想保持事务的隔离性,又想让服务器在处理访问同一数据的多个事务时性能尽量高些 ,那就看二者如何权衡取舍了。事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。一个长事务把短事务的修改给覆盖了,让短事务查询不到自己的修改结果,(两个事务都是写,同时写)..

2022-08-18 13:19:31 301

原创 索引优化与查询优化

物理查询优化是通过索引和表连接方式等技术来进行优化,这里重点需要掌握索引的使用。逻辑查询优化就是通过SQL等价变换提升查询效率,直白一点就是说,换一种查询写法效率可能更高。对于单列索引,尽量选择针对当前query过滤性更好的索引在选择组合索引的时候,当前query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。在选择组合索引的时候,尽量选择能够当前query中where子句中更多的索引。在选择组合索引的时候,如果某个字段可能出现范围查询时,尽量把这个字段放在索引次序的最后面。...

2022-08-17 23:09:21 173

原创 数据库调优:性能分析工具EXPLAIN的使用

system>const>eq_ref>refrange>index>ALL其中比较重要的几个提取出来〈见上图中的蓝色)。SQL性能优化的目标:至少要达到range级别,要求是ref级别,最好是consts级别。(阿里巴巴开发手册要求)EXPLAIN不考虑各种CacheEXPLAIN不能显示MySQL在执行查询时所作的优化工作EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况部分统计信息是估算的,并非精确值。...

2022-08-14 21:46:29 521

原创 数据库调优:定位慢查询

整个流程划分成了和两个部分。字母 S 的部分代表观察(会使用相应的分析工具),字母 A 代表的部分是行动(对应分析可以采取的行动)。在MySQL中,可以使用 SHOW STATUS 语句查询一些MySQL数据库服务器的SHOW STATUS语句语法如下:Connections:连接MySQL服务器的次数。Uptime:MySQL服务器的上线时间。Slow_queries:慢查询的次数。Innodb_rows_read:Select查询返回的行数Innodb_rows_inserted:执行IN

2022-08-12 12:49:04 447

原创 索引的设计原则

联合索引的最左字段可以当作单列索引使用,这时候有联合索引和单列索引(最左字段和单列字段一致),此时单列索引就没有必要了在实际工作中,我们也需要注意平衡,索引的数目不是越多越好。我们需要限制每张表上的索引数量,建议单张表索引数量不超过6个。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。索引会影响INSERT、DELETE、UPDATE等语句的性能,因为表中的数据更改的同时,索引也会进行调整和更新,会造成负担。...

2022-08-11 15:47:08 554

原创 索引的创建、查看、删除

- 从`功能逻辑`上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。- 按照`物理实现方式`,索引可以分为 2 种:聚簇索引和非聚簇索引。- 按照`作用字段个数`进行划分,分成单列索引和联合索引。...

2022-08-10 15:07:02 1229

原创 RabbitMQ幂等性、优先级、惰性

但是,商家对于我们来说,肯定是要分大客户和小客户的对吧,比如像苹果,小米这样大商家一年起码能给我们创造很大的利润,所以理应当然,他们的订单必须得到优先处理,而曾经我们的后端系统是使用 redis 来存放的定时轮询,大家都知道 redis 只能用 List 做一个简简单单的消息队列,并不能实现一个优先级的场景,所以订单量大了后采用 RabbitMQ 进行改造和优化,如果发现是大客户的订单给一个相对比较高的优先级, 否则就是默认优先级。即使是持久化的消息,在被写入磁盘的同时也会在内存中驻留一份备份。...

2022-08-09 21:10:30 87

原创 RabbitMQ发布确认高级

在生产环境中由于一些不明原因,导致 RabbitMQ 重启,在 RabbitMQ 重启期间生产者消息投递失败, 导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投递呢?...

2022-08-09 09:34:38 103

原创 RabbitMQ的死信队列和延迟队列

死信就是无法被消费的消息,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,死信队列就是处理死信的。应用场景:为了保证订单业务的消息数据不丢失,需要使用到 RabbitMQ 的死信队列机制,当消息消费发生异常时,将消息投入死信队列中.还有比如说: 用户在商城下单成功并点击去支付后在指定时间未支付时自动失效

2022-08-07 21:14:49 873

原创 RabbitMQ核心模式

它是将接收到的所有消息广播到它知道的所有队列中为了说明这种模式,我们将构建一个简单的日志系统。它将由两个程序组成:第一个程序将发出日志消 息,第二个程序是消费者。其中我们会启动两个消费者,其中一个消费者接收到消息后把日志存储在磁盘,另外一个消费者接收到消息后把消息打印在屏幕上(一个消息被两个消费者同时处理)消费者创建一个随机队列和声明一个Fanout交换机,队列绑定Fanout类型交换机,最后消费监听生产者声明一个Fanout交换机,往交换机发送信息/**...

2022-08-07 09:52:45 398

原创 MQ的概念

使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这时有些用户可能在下单十几秒后才能收到下单成功的操作,但是比不能下单的体验要好。MQ(message queue)本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而已,还是一种跨进程的通信机制,用于上下游传递消息。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。A 调用 B 服务后,只需要监听 B 处理完成的消息,当 B 处理完成后,会发送一条消息给 MQ,MQ 会将此。...

2022-08-05 21:02:58 142

原创 索引数据结构选择

InnoDB的B+树索引结构也提供自适应Hash索引,也就是对于一些经常用到的数据,InnoDB会存储到Hash表中,下次查询就会直接从自适应Hash表中。如何用 B 树进行查找。Hash索引效率高,那为什么用树作为常用的索引结构呢。Hash 索引与 B+ 树索引的区别。Hash结构一般用于缓存数据库。...

2022-08-04 22:34:22 95

原创 索引数据结构

索引(Index)是帮助MySQL高效获取数据的数据结构。

2022-08-04 21:33:45 485

原创 Mysql数据类型

整数类型字节数(一字节等于8位)TINYINT1SMALLINT2MEDIUMINT34BIGINT8。

2022-07-31 19:14:03 389

原创 职责链模式(responsibilitychain)

一个人请假,根据请假天数的不同,应该由不同的人处理。

2022-07-31 11:52:20 56

原创 命令模式(Command)

命令模式比较简单,但是在项目中非常频繁地使用,因为它的封装性非常好,把请求方(Invoker)和执行方(Receiver)分开了,扩展性也有很好的保障,通用代码比较简单。先看一下Receiver类。该角色就是干活的角色,命令传递到这里是应该被执行的,具体到我们上面的例子中就是弓箭手和冲锋士兵的两个实现类。其实就是通过负责人发布命令,命令关联着具体的执行者,让执行者去执行自己的行为。我们要把将军(请求方)和士兵(执行方)分离开。接收到命令,并执行命令。需要执行的所有命令都在这里声明。...

2022-07-30 22:53:43 124

原创 Redis查询缓存

缓存10和数据库20出现了不一致,这种出现问题可能较小,因为写缓存时间非常短,这期间出现一个并发的线程插入可能较小。因为缓存不存在过期,只有逻辑过期(查不到热点,证明数据库也没有了),所以直接返回空,解决了缓存穿透问题,就不用考虑了。缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。更新缓存每次更新数据库都更新缓存,假如更新数据库100次,缓存也更新100次,但期间没人查询,删除缓存更新数据库时让缓存失效,查询时再更新缓存。先删除缓存,再操作数据库。...

2022-07-30 17:58:22 1748

原创 中介者模式(Mediator)

中介者作为三个模块的交流核心,每个模块之间不再相互交流,要交流就通过中介者进行。每个模块只负责自己的业务逻辑,不属于自己的则丢给中介者来处理,简化了各模块之间的耦合关系。我们从这个示意图上可以看出,三个模块是相互依赖的。采购部门要采购IBM的电脑,它根据以下两个要素来决定采购数量。...

2022-07-30 12:16:15 128

原创 ElasticSearch

映射操作text:会分词,不支持聚合keyword:不会分词,将全部longintegershortinteger_rangefloat_rangedate[]{}文档操作整合SpringBoot批量操作导入数据查询查询所有词条不分词等值查询分词模糊查询wildcard查询:会对查询条件进行分词。还可以使用通配符?(单个字符)和*(0或多个字符)regexp查询:正则查询prefix查询:前缀

2022-07-01 17:31:03 251

原创 原子类Atomic

文章目录简介原子整数AtomicInteger相关API原子引用简介该类的实例操作能保证原子性,多个线程下可以保证线程安全原子整数AtomicInteger相关APIpublic class Test15 { public static void main(String[] args) { AtomicInteger i = new AtomicInteger(2); System.out.println(i.incrementAndGet())

2022-06-14 22:10:00 76

原创 享元模式(Flyweight)

设计模式

2022-06-13 18:49:57 72

原创 Reactor模式

reactor模式

2022-06-12 14:46:46 69

原创 Java NIO(New IO)

NIO编程

2022-06-10 17:09:25 196

原创 高并发IO底层原理

IO底层理解

2022-06-01 13:11:08 458 1

原创 Cookie和Session

文章目录Cookie简介Cookie简介Cookie是1993年由网景公司(Netscape)前雇员发明的一种进行网络会话状态跟踪的技术。会话是由一组请求与响应组成,是围绕着一件相关事情所进行的请求与响应。所以这些请求与响应之间一定是需要有数据传递的,即是需要进行会话状态跟踪的。然而HTTP协议是一种无状态协议,在不同的请求间是无法进行数据传递的。此时就需要一种可以进行请求间数据传递的会话跟踪技术,而Cookie就是一种这样的技术。cookie是由服务器生成,保存在客户端的一种信息载体。这

2022-05-28 22:53:08 271

原创 无锁并发-CAS机制

文章目录示例代码volatile无锁的效率CAS特点示例代码package thread;import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicInteger;/** * @author pangjian * @Interface Account * @Description 比较线程不安全,无锁安全并发和有锁安全并发 * @date 2021/11/4 12

2021-11-04 17:51:34 205

原创 JMM-有序性

文章目录无序性指令级并行解决办法问题解决问题happens-before无序性JVM 会在不影响正确性的前提下,可以调整语句的执行顺序// 这两行代码执行顺序是不一定的,可能先对j赋值i = ...; j = ...; 指令级并行示例代码/** * @author pangjian * @ClassName ConcurrencyTest * @Description 并发测试 * @date 2021/11/3 14:10 */@JCStressTest // 标记

2021-11-04 11:09:56 297

原创 JMM-可见性

文章目录Java内存模型代码解读volatile(易变关键字)synchronized区别Java内存模型JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面:原子性 - 保证指令不会受到线程上下文切换的影响可见性 - 保证指令不会受 cpu 缓存的影响有序性 - 保证指令不会受 cpu 指令并行优化的影响代码解读@Slf4jpublic class Test09

2021-11-03 13:57:40 124

原创 ReentrantLock

文章目录特性基本语法可重入可打断锁超时哲学家问题条件变量特性相对于 synchronized 它具备如下特点可中断可以设置超时时间可以设置为公平锁支持多个条件变量基本语法reentrantLock.lock();try { // 临界区代码} finally { // 释放锁 reentrantLock.unlock();}可重入可重入是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁,如果是不可重入锁,那么

2021-11-03 12:08:57 81

原创 活锁LiveLock

文章目录活锁代码区别解决方法活锁代码@Slf4jpublic class LiveLock { static volatile int count = 10; static final Object object = new Object(); public static void main(String[] args) { new Thread(() -> { while (count > 0) {

2021-11-02 13:30:34 130

空空如也

空空如也

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

TA关注的人

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