自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(101)
  • 资源 (11)
  • 收藏
  • 关注

原创 MacOS M1在CentOS8下安装Docker遇到的问题

最近一直在使用MACOS的M1系列电脑开发,发现在Centos8虚拟机环境下安装docker的各种问题,在这里进行总结,以备后期使用和参考。

2024-10-26 12:07:03 1186 1

原创 设计模式 | 一文搞懂工厂模式

工厂模式通过引入一个工厂类来负责对象的创建,解决了这些问题。工厂类封装了对象创建的逻辑,使得客户端代码只需要与工厂类交互,而不需要了解对象的具体创建过程。这样,当对象的创建逻辑发生变化时,只需要在工厂类中进行修改,而不会影响到客户端代码。

2024-10-25 17:17:15 1116

原创 设计模式 | 6大设计原则

单一职责原则:一个类应该只有一个引起它变化的原因。也就是说,一个类只负责一项职责。开闭原则:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。里氏替换原则:所有引用基类(父类)的地方必须能透明地使用其子类的对象。依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。接口隔离原则:客户端不应该被迫依赖于它不使用的接口;一个类对另一个类的依赖应该建立在最小的接口上。迪米特法则:一个对象应该对其他对象有最少的了解。也叫最少知识原则。

2024-10-25 13:01:57 1388

原创 RocketMQ | 源码分析 | MappedFile核心存储类

RocketMQ的存储都基于MappedFile实现,如CommitLog、Index索引、ConsumeQueue等,本文则主要介绍的实现机制,包括MappedFileQueue类介绍、MappedFile类介绍、预热、MappedFile预分配服务AllocateMappedFileService、MappedFile刷盘等内容。

2024-10-24 10:27:49 1239

原创 RocketMQ | 源码分析 | 消息刷盘

通过上面的分析,我们了解了RocketMQ的两种刷盘策略:一种是类似强一致的,保证消息存储到文件中的同步策略。一种是提交到内存中就算存储成功,在后台异步进行刷盘的异步策略。无论是哪种策略,肯定都有自己的优点和缺点,大家可以根据自己生成环境,选择合适的刷盘策略。

2024-10-22 10:23:11 1223

原创 RocketMQ | 源码分析 | Broker控制器的启动

总结一下,RocketMQ 会创建多个MappedFile用来存储文件,每个MappedFile大小固定,有自己的内存缓冲区和对应的系统文件,所有的MappedFile由CommitLog中的MappedFileQueue统一维护。本篇文章主要讲解了消息从接收到存储到内存中的过程,但是事情到这还没结束,因为消息最终是要存放到文件中的,下一篇文章就要来说说RocketMQ的文件刷盘策略。

2024-10-22 09:56:44 979

原创 RocketMQ | 源码分析 | 消息存储Broker分析

Broker负责接收生产者发送的消息并存储、同时为消费者消费消息提供支持。为了实现这些功能,Broker包含几个重要的子模块:● 通信模块:负责处理来自客户端(生产者、消费者)的请求。● 客户端管理模块:负责管理客户端(生产者、消费者)和维护消费者的Topic订阅信息。● 存储模块:提供存储消息和查询消息的能力,方便Broker将消息存储到硬盘。

2024-10-22 09:28:07 993

原创 RocketMQ | 源码分析 | NameServer篇

Namesrv是RocketMQ最简单的一部分,骨头我们先挑最软的一根啃,本次引用的源码来于4.8.0版本,由于笔者水平有限欢迎大家批评指正。从上面的源码我们可以找到一开始我们抛出的三个问题的答案。①:Namesrv通过定时扫描Broker主动上报心跳信息来判断Broker是否存活。②:通过方法获取类维护的路由信息。

2024-10-22 09:15:03 1661

原创 RocketMQ | 消息存储

分布式队列因为有高可靠性的要求,所以数据要进行持久化存储。

2024-10-15 15:08:53 922

原创 MySQL | 实战 | 如何解决MySQL主从复制延时问题

所谓 MySQL 主从,就是建立两个完全一样的数据库,一个是主库,一个是从库,主库对外提供读写的操作,从库对外提供读的操作。

2024-09-25 07:00:00 874

原创 MySQL | 实战 | 4 种将数据同步到ES方案

在实际项目开发中,我们经常将 MySQL 作为业务数据库,ES 作为查询数据库,用来实现读写分离,缓解 MySQL 数据库的查询压力,应对海量数据的复杂查询。这其中有一个很重要的问题,就是如何实现 MySQL 数据库和 ES 的数据同步,今天和大家聊聊 MySQL 和 ES 数据同步的各种方案。我们先看看下面 4 种常用的数据同步方案。

2024-09-24 07:00:00 4779 1

原创 MySQL | 实战 | 隐式转换的坑

本来是一个平静而美好的下午,其他部门的同事要一份数据报表临时汇报使用,因为系统目前没有这个维度的功能,所以需要写个SQL马上出一下,一个同事接到这个任务,于是开始在测试环境拼装这条 SQL,刚过了几分钟,同事已经自信的写好了这条SQL,于是拿给DBA,到线上跑一下,用客户端工具导出Excel 就好了,毕竟是临时方案嘛。就在SQL执行了之后,意外发生了,先是等了一下,发现还没执行成功,猜测可能是数据量大的原因,但是随着时间滴滴答答流逝,逐渐意识到情况不对了,一看监控,

2024-09-23 07:00:00 652

原创 MySQL | 知识 | NULL值是怎么存储的

我们使用mysql时,使用xx!='aa'这种条件为什么无法筛选出值为NULL的字段呢。是的,MySQL 中null 值确实无法通过这种条件筛选出来,因为 null 值的定义就跟普通值不一样。第一条 SQL 表达的意思是:不知道这个人的手机号码,。第二条 SQL 表达的意思是:这个人就是。按照这个角度去看待群里同学的提问,其实不难理解为什么 xx!=‘xx’ 查询不出 null 的数据了。因为 null 值表示未知,它的值可能是任意你能想到的值,目前还不能定义它。

2024-09-22 07:00:00 1730

原创 MySQL | 知识 | distinct和group by哪个效率更高

两者的语法区别在于,group by可以进行单列去重,group by的原理是先对结果进行分组排序,然后返回每组中的第一条数据。且是根据group by的后接字段进行去重的。如果列具有NULL值,并且对该列使用DISTINCT子句,MySQL将保留一个NULL值,并删除其它的NULL值,因为DISTINCT子句将所有NULL值视为相同的值。distinct多列的去重,则是根据指定的去重的列信息来进行,即只有所有指定的列信息都相同,才会被认为是重复的信息。的内容),我们对这两条sql进行分析,可以看到,在。

2024-09-21 07:00:00 1395

原创 MySQL | 知识 | count(*) 和 count(1) 有什么区别?哪个性能最好

当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如count(1)count(*)count(字段)等。到底哪种效率是最好的呢?是不是count(*)效率最差?我曾经以为count(*)是效率最差的,因为认知上会读取所有表中的字段,所以凡事带有字符的就觉得会读取表中所有的字段,当时网上有很多博客也这么说。但是,当我深入 count 函数的原理后,被啪啪啪的打脸了!

2024-09-20 07:00:00 1230

原创 分布式Redis(14)哈希槽

Redis 是一款广泛使用的高性能键 - 值存储数据库。在数据分片方面,Redis 采用了哈希槽(Hash Slot)的方式,而非一致性哈希(Consistent Hashing),这是基于多方面的考量。Redis 集群预先分配了 16384 个哈希槽。这种固定数量的哈希槽使得数据分布的管理更加容易。每个节点负责一定数量的哈希槽,例如,在一个有 N 个节点的集群中,每个节点大致负责 16384/N 个哈希槽。相比之下,一致性哈希的数据分布相对更 “自由”,可能导致在节点数量变化时数据迁移的不可预测性增加。

2024-09-19 16:05:02 1561

原创 MySQL | 知识 | 揭开 Buffer Pool 的面纱

先来说说 MySQL 的预读机制。程序是有空间局部性的,靠近当前被访问数据的数据,在未来很大概率会被访问到。所以,MySQL 在加载数据页时,会提前把它相邻的数据页一并加载进来,目的是为了减少磁盘 IO。但是可能这些被提前加载进来的数据页,并没有被访问,相当于这个预读是白做了,这个就是预读失效。如果使用简单的 LRU 算法,就会把预读页放到 LRU 链表头部,而当 Buffer Pool空间不够的时候,还需要把末尾的页淘汰掉。

2024-09-19 07:00:00 708

原创 MySQL | 知识 | 从底层看清 InnoDB 数据结构

大家都知道 mysql 中数据是存储在物理磁盘上的,而真正的数据处理又是在内存中执行的。由于磁盘的读写速度非常慢,如果每次操作都对磁盘进行频繁读写的话,那么性能一定非常差。为了上述问题,InnoDB 将数据划分为若干页,以页作为磁盘与内存交互的基本单位,一般页的大小为 16KB。这样的话,一次性至少读取 1 页数据到内存中或者将 1 页数据写入磁盘。通过减少内存与磁盘的交互次数,从而提升性能。时间维度:如果一条数据正在在被使用,那么在接下来一段时间内大概率还会再被使用。

2024-09-18 07:00:00 1171

原创 Mysql | 知识 | 执行一条查询语句期间发生了什么

执行一条 SQL 查询语句,期间发生了什么?连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;执行 SQL:执行 SQL 共有三个阶段:预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。

2024-09-17 19:00:00 1546

原创 Mysql | 知识 | 幻读是如何解决的

在 MySQL 中,虽然 MVCC 是一个非常强大的并发控制机制,但它不能完全解决幻读问题。幻读问题在不同的事务隔离级别下有不同的表现,而在可重复读隔离级别下,Next - Key 锁通过对记录和间隙的锁定,弥补了 MVCC 在防止幻读方面的不足。对于开发人员和数据库管理员来说,深入理解 MVCC 和 Next - Key 锁的工作原理,有助于在设计和管理数据库应用时,正确处理并发事务,确保数据的一致性和准确性。

2024-09-17 14:07:44 1581

原创 Mysql | 知识 | 理解是怎么加锁的

这次我以 MySQL 8.0.26 版本,在可重复读隔离级别之下,做了几个实验,让大家了解了唯一索引和非唯一索引的行级锁的加锁规则。我这里总结下, MySQL 行级锁的加锁规则。当查询的记录是「存在」的,在索引树上定位到这一条记录后,将该记录的索引中的 next-key lock 会退化成「记录锁」。当查询的记录是「不存在」的,在索引树找到第一条大于该查询记录的记录后,将该记录的索引中的 next-key lock 会退化成「间隙锁」。

2024-09-14 15:00:25 1030

原创 Mysql | 知识 | 多版本并发控制(MVCC)

全称Multi-Version Concurrency Control,即多版本并发控制,主要是为了提高数据库的并发性能。以下文章都是围绕InnoDB引擎来讲,因为myIsam不支持事务。同一行数据平时发生读写请求时,会上锁阻塞住。但mvcc用更好的方式去处理读—写请求,做到在发生快照读—写请求冲突时不用加锁。这个读是指的快照读,而不是当前读,当前读是一种加锁操作,是悲观锁。其特点就是在同一时间,不同事务可以读取到不同版本的数据,从而去解决脏读和不可重复读的问题。

2024-09-11 07:00:00 1210

原创 Mysql | 知识 | 事务隔离级别

我的钱包,共有 100 元。今天我心情好,我决定给你的转账99元,最后的结果肯定是我的余额变为 1元,你的余额多了99元。可以看到这个转账的过程涉及到了两次修改数据库的操作。假设在执行第三步骤之后,服务器忽然掉电了,就会发生一个蛋疼的事情,我的账户扣了 99元,但是钱并没有到你的账户上,也就是说这 99元消失了!要解决这个问题,就要保证转账业务里的所有数据库的操作是不可分割的,要么全部执行成功 ,要么全部失败,不允许出现中间状态的数据。

2024-09-10 18:00:00 1049

原创 Mysql | 知识 | 有哪些琐

当事务 A 还没提交的时候,事务 B 向该表插入一条 id = 4 的新记录,这时会判断到插入的位置已经被事务 A 加了间隙锁,于是事物 B 会生成一个插入意向锁,然后将锁的状态设置为等待状态(PS:MySQL 加锁时,是先生成锁结构,然后设置锁的状态,如果锁状态是等待状态,并不是意味着事务成功获取到了锁,只有当锁状态为正常状态时,才代表事务成功获取到了锁),此时事务 B 就会发生阻塞,直到事务 A 提交了事务。这种方法只适用于支持「可重复读隔离级别的事务」的存储引擎。write)发生冲突。

2024-09-10 12:33:44 1297

原创 算法 | 归并排序 | 小和、逆序对问题

在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个给定数组的小和。例子:数组为:[1,3,4,2,5]1左边比1小的数:没有3左边比3小的数:14左边比4小的数:1,32左边比2小的数:15左边比5小的数:1,3,4,2所以小和为1+(1+3)+1+(1+3+4+2)=16:找每一个数右边比当前数大的个数,(个数 * 当前数) 的累加和就是结果。

2024-09-09 09:00:00 377

原创 算法 | 基础 | 局部最小值问题 | 二分发

给定一个不包含相同元素的整数数组,求一个局部最小值。题解1)数组第一个元素比第二个元素小,即为局部最小值。2)数组最后一个元素比它前一个元素小,即为局部最小值。3)若不满足,那么局部最小值必在数组首尾两元素之间的某个位置取得。此时可以采用二分法思想,看中间位置是否符合条件,不符合就分成两部分,从不符合的那一边继续操作。

2024-09-08 11:00:00 508

原创 多线程 | CompletableFutureAPI简单介绍

计算结果的处理:对前面计算结果进行处理,无法返回新值//方法一super T,?//方法二super T,?//方法三super T,?super T,?super U,?extends V> fn参数 => 定义对结果的处理Executor executor参数 => 自定义线程池以async结尾的方法将会在一个新的线程中执行组合操作示例:本次只是介绍CompletableFuture的常用方法介绍,具体还需要结合根据自己业务代码进行使用。

2024-09-08 09:00:00 706

原创 多线程 | join方法

如果thread1在执行过程中被中断,它会捕获InterruptedException异常并打印相应的消息,同时再次设置中断标志。当一个线程调用另一个线程的join方法时,当前线程会进入等待状态,直到被调用的线程执行完毕。这使得开发者可以控制线程的执行顺序,确保某些关键线程在其他线程之前完成执行。因此,在使用join方法时,需要仔细考虑线程之间的依赖关系,避免死锁的发生。InterruptedException异常:当一个线程在等待另一个线程执行完毕时,如果被中断,会抛出异常,如下代码。

2024-09-07 17:00:00 2710

原创 算法 | 基础 | 出现奇数次的数字

本篇是关于异或()运算的运用。后期看算法过程中如果再碰到异或的都会收录到本篇中。

2024-09-07 12:41:40 852

原创 多线程 | ThreadLocal源码分析

ThreadLocal 是一种特殊的无锁线程安全方式,通过为每个线程分配独立的资源副本,从根本上避免发生资源冲突;ThreadLocal 在所有线程间隔离,InheritableThreadLocal 在创建子线程时会拷贝父线程中 InheritableThreadLocal 的有效键值对;虽然 ThreadLocal 提供了自动清理数据的能力,但是自动清理存在滞后性。为了避免内存泄漏,在业务开发中应该及时调用 remove 清理无效的局部存储;

2024-09-07 09:00:00 1095

原创 多线程 | synchronized的优化

在了解了 synchronized 重量级锁效率特别低之后,jdk 自然做了一些优化,出现了偏向锁,轻量级锁,重量级锁,锁膨胀、锁消除、锁粗化、自适应自旋锁等优化。

2024-09-06 09:00:00 1450

原创 多线程 | synchronized的底层原理

JVM的同步,是基于进入与退出监视器对象(Monitor)来实现的,也即是管程;每个对象实例都会有个Monitor对象,这是JVM分配的。Monitor对象会和java对象一同创建并销毁。Monitor对象是由C++来实现的。当多个线程同时访问一段同步代码时,这些线程会被放到一个EntryList集合中,处于堵塞状态的线程都会被放到该列表当中(wait方法可查)。

2024-09-05 16:55:18 975

原创 多线程 | synchronized的简单使用

synchronized 修饰的实例方法,多线程并发访问时,只能有一个线程进入,获得对象内置锁,其他线程阻塞等待,但在此期间线程仍然可以访问其他方法。synchronized 修饰的静态方法,多线程并发访问时,只能有一个线程进入,获得类锁,其他线程阻塞等待,但在此期间线程仍然可以访问其他方法。synchronized 修饰的代码块,多线程并发访问时,只能有一个线程进入,根据括号中的对象或者是类,获得相应的对象内置锁或者是类锁。

2024-09-05 16:37:52 522

原创 Redis(13)| 缓存与数据库数据一致性问题

只要用到多数据源存储同一份相同的数据,在更新时,都会考虑数据一致性问题。这是常见问题,但是对于分布式系统的CAP 理论,相信很多人都听过,它是指:一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。为什么要理解 CAP 理论?我能说出很多理由来。如果是在职场上,也许最合适的理由是,当领导给出的任务不靠谱时,我们可以依据 CAP 去否决它。1. 这个系统满足编辑后数据要有实时性可见;

2024-09-01 21:41:13 1171

原创 Redis(13)| 主从复制

我在前已经给大家图解了 AOF 和 RDB,这两个持久化技术保证了即使在服务器重启的情况下也不会丢失数据(或少量损失)。不过,由于数据都是存储在一台服务器上,如果出事就完犊子了,比如:如果服务器发生了宕机,由于数据恢复是需要点时间,那么这个期间是无法服务新的请求的;如果这台服务器的硬盘出现了故障,可能数据就都丢失了。要避免这种单点故障,最好的办法是将数据备份到其他服务器上,让这些服务器也可以对外提供服务,这样即使有一台服务器出现了故障,其他服务器依然可以继续提供服务。

2024-09-01 12:44:38 823

原创 Redis(12)| 过期删除策略和内存淘汰策略

Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略。

2023-11-11 15:25:31 530

原创 Redis(11)| 持久化AOF和RDB

Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这个文件里的命令,并且执行它。注意:只会记录写操作命令,读操作命令是不会被记录的,因为没意义。AOF 日志文件其实就是普通的文本,我们可以通过 cat 命令查看里面的内容,不过里面的内容如果不知道一定的规则的话,可能会看不懂。我这里给大家解释下。「*3」表示当前命令有三个部分,每部分都是以「$+数字」开头,后面紧跟着具体的命令、键或值。

2023-11-02 18:45:00 212

原创 Redis(10)| I/O多路复用(mutiplexing)

看上图,通俗讲就是I/O multiplexing 这里面的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态(对应空管塔里面的Fight progress strip槽)来同时管理多个I/O流. 发明它的原因,是尽量多的提高服务器的吞吐能力。那么什么是IO多路复用机制呢,Linux 中的 IO 多路复用机制是指一个线程处理多个 IO 流,就是我们经常听到的 select/epoll 机制。

2023-10-30 20:45:00 279

原创 Redis(09)| Reactor模式

通过select/poll/epoll/kqueue这些I/O多路复用函数库,我们解决了一个线程处理多个连接的问题,但整个Reactor模式的完整框架是怎样的呢?参考这篇paper,我们可以对Reactor模式有个完整的描述。Handles:表示操作系统管理的资源,我们可以理解为fd。:同步事件分离器,阻塞等待Handles中的事件发生。:初始分派器,作用为添加Event handler(事件处理器)、删除Event handler以及分派事件给Event handler。

2023-10-29 12:00:00 346

原创 Redis(07)| 数据结构-跳表

Redis 只有 Zset 对象的底层实现用到了跳表,跳表的优势是能支持平均 O(logN) 复杂度的节点查找。zset 结构体里有两个数据结构:一个是跳表,一个是哈希表。这样的好处是既能进行高效的范围查询,也能进行高效单点查询。Zset 对象在执行数据插入或是数据更新的过程中,会依次在跳表和哈希表中插入或更新相应的数据,从而保证了跳表和哈希表中记录的信息一致。

2023-10-29 08:30:00 210

robomongo 64位可视化客户端

robomongo是一个mongoDB可视化工具,界面简洁清晰直观,更重要的是比较稳定。

2017-02-14

mongodb-win32-i386-2.0.6

mongodb-win32-i386-2.0.6.zip 32位操作系统的mongodb数据库

2016-02-14

mongodb-win32-x86_64-2.0.6

mongodb-win32-x86_64-2.0.6 是windows操作系统64位环境下的工具类

2016-02-14

mongo-java-driver-2.5.jar

java 操作mongodb的驱动包,主要是进行mongodb的增删改查,导入工程直接使用,经过测试,

2016-01-28

Bulletproof Ajax中文版

Bulletproof Ajax中文版pdf电子书,WEB设计师的力作,剖析全新的AJAX开发方法——Hijax带来的全新的体验。应该说,这是一本与众不同的Ajax教程书籍,读起来如饮清泉,很多人会问,一本不到200多页的书,能讲清Ajax吗?答案是当然能,如果你不信,那你正需要赶快阅读本书。书中著名的JavaScript专家Jeremy Keith提出目前已经得到广泛重视的Hijax方法,使我们了解更深层次的Ajax。

2015-08-13

ThinkinJava doc版

Thinkinjava word doc版本,可以修改和编辑

2015-08-12

easyui_api-demo-themes

easyui是一种基于jQuery的用户界面插件集合。 easyui为创建现代化,互动,JavaScript应用程序,提供必要的功能。 使用easyui你不需要写很多代码,你只需要通过编写一些简单HTML标记,就可以定义用户界面。 easyui是个完美支持HTML5网页的完整框架。 easyui节省您网页开发的时间和规模。 easyui很简单但功能强大的。

2014-12-29

Java学习流程

对想学习Java的同学分享下我以前的学习Java流程

2014-03-19

Java设计模式

23中设计模式,其中包括最常见的工厂模式、单例模式、装饰模式等等

2014-03-19

android学习笔记

android的学习基础,对android进行了基本的描述和分析

2014-03-19

jquery-1.9.1.min.js

用于对JavaWeb 开发时,引入jquery文件,动态网页

2013-12-14

空空如也

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

TA关注的人

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