自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2024-09-25 07:00:00 560

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

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

2024-09-24 07:00:00 819

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

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

2024-09-23 07:00:00 540

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

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

2024-09-22 07:00:00 1595

原创 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 627

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

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

2024-09-20 07:00:00 978

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

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

2024-09-19 16:05:02 1311

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

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

2024-09-19 07:00:00 536

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

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

2024-09-18 07:00:00 999

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

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

2024-09-17 19:00:00 1380

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

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

2024-09-17 14:07:44 1368

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

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

2024-09-14 15:00:25 838

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

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

2024-09-11 07:00:00 1056

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

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

2024-09-10 18:00:00 991

原创 Mysql | 知识 | 有哪些琐

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

2024-09-10 12:33:44 1221

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

在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个给定数组的小和。例子:数组为:[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 314

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

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

2024-09-08 11:00:00 455

原创 多线程 | CompletableFutureAPI简单介绍

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

2024-09-08 09:00:00 607

原创 多线程 | join方法

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

2024-09-07 17:00:00 1009

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

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

2024-09-07 12:41:40 762

原创 多线程 | ThreadLocal源码分析

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

2024-09-07 09:00:00 1000

原创 多线程 | synchronized的优化

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

2024-09-06 09:00:00 1219

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

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

2024-09-05 16:55:18 920

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

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

2024-09-05 16:37:52 468

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

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

2024-09-01 21:41:13 1038

原创 Redis(13)| 主从复制

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

2024-09-01 12:44:38 753

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

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

2023-11-11 15:25:31 468

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

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

2023-11-02 18:45:00 171

原创 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 207

原创 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 268

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

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

2023-10-29 08:30:00 140

原创 JVM调优(10)JVM的运行时数据区

对于 C C++ 来说,在内存管理领域,JVM既拥有最高的权利,但是同时他们又是从事最基础工作的劳动人员,因为他们担负着每一个对象从开始到结束的维护责任。而对于Java来说,再虚拟机自动内存管理的帮助下,不再需要为每一个new操作去分配内存,不容易出现内存泄漏和内存溢出的情况,但是因为我们Java程序员 不用管理内存,所以一旦出现内存问题,很容易让我们手忙脚乱,所以呢我们必须要了解Java虚拟器的内存管理机制,以便我们能更好的处理各种各样的问题。

2023-10-28 20:54:10 606

原创 Redis(06)| 数据结构-整数集合

整数集合是 Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素,并且元素数量不大时,就会使用整数集这个数据结构作为底层实现。

2023-10-28 17:30:00 115

原创 Redis(05)| 数据结构-哈希表

哈希表是一种保存键值对(key-value)的数据结构。哈希表中的每一个 key 都是独一无二的,程序可以根据 key 查找到与之关联的 value,或者通过 key 来更新 value,又或者根据 key 来删除整个 key-value等等。在讲压缩列表的时候,提到过 Redis 的 Hash 对象的底层实现之一是压缩列表(最新 Redis 代码已将压缩列表替换成 listpack)。Hash 对象的另外一个底层实现就是哈希表。哈希表优点在于,它能以 O(1) 的复杂度快速查询数据。

2023-10-28 12:44:56 244

原创 Redis(08)| 线程模型

redis 内部使用文件事件处理器 file event handler,它是单线程的,所以redis才叫做单线程模型。它采用IO多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理。

2023-10-28 11:51:13 453

原创 Redis(04)| 数据结构-压缩列表

压缩列表的最大特点,就是它被设计成一种内存紧凑型的数据结构,占用一块连续的内存空间,不仅可以利用 CPU 缓存,而且会针对不同长度的数据,进行相应编码,这种方法可以有效地节省内存开销。

2023-10-27 21:46:18 606

原创 Redis(03)| 数据结构-链表

大家最熟悉的数据结构除了数组之外,我相信就是链表了。Redis 的 List 对象的底层实现之一就是链表。C 语言本身没有链表这个数据结构的,所以 Redis 自己设计了一个链表数据结构。

2023-10-27 12:30:00 230

原创 Redis(02)| 数据结构-SDS

在开始讲数据结构之前,先给介绍下 Redis 是怎样实现键值对(key-value)数据库的。Redis 的键值对中的 key 就是字符串对象,而 value 可以是字符串对象,也可以是集合数据类型的对象,比如 List 对象、Hash 对象、Set 对象和 Zset 对象。这些命令代表着:● 第一条命令:name 是一个字符串键,因为键的值是一个字符串对象;● 第二条命令:person 是一个哈希表键,因为键的值是一个包含两个键值对的哈希表对象;

2023-10-26 22:53:21 514

原创 Redis(01)| 数据结构

Redis 速度快的原因除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理。因此,这次我们就来好好聊一下 Redis 数据结构,这个在面试中太常问了。

2023-10-26 22:23:53 821

原创 数据结构与算法之红黑树

在上一篇我们说到2-3树在某些情况插入后的平衡操作可能会使得效率降低,在2-3查找树基础上改进的红黑树不仅具有较高的效率。那么红黑树是如何操作的呢?定义红黑树是一种近似平衡的二叉查找树,它能够确保任何一个节点的左右子树的高度差不会超过二者中较低那个的一陪。具体来说,红黑树是满足如下条件的二叉查找树(binary search tree):每个节点要么是黑色要么是红色根节点是黑色每个叶子节点是黑色,并且为空节点(还有另外一种说法就是,每个叶子结点都带有两个空的黑色结点(被称为黑哨兵),如果一个结点

2021-07-25 18:06:58 258

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关注的人

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