自定义博客皮肤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)
  • 收藏
  • 关注

原创 AQS 抽象队列同步器

非公平锁的tryAcquire 方法会先判断锁的状态state是否为0,为0说明没有被其他线程占用,就立即使用cas操作变更state为1,变更成功就把持有锁的线程设置为自己,变更失败就表示加锁失败。AQS的tryRelease方法,同样没有做实现,需要子类自己去实现,下面是ReentrantLock的实现。AQS类的tryAcquire方法只是做了规范,方法内直接抛出异常,所以这个方法需要由子类去实现。如果锁的状态为1,说明锁已经被占用,在比较当前线程和持有锁的线程是否一致,不一致就加锁失败。

2024-01-07 17:04:21 827 1

原创 java CAS

示例:不通过 synchronized 和 lock ,就实现了锁的功能,自己实现自旋锁。想要解决ABA问题,需要加上版本号或者时间戳。循环时间太长的话,开销会很大。

2024-01-07 16:56:51 892

原创 JMM内存模型

变量的写操作和读操作之间是可以被中断的,也就是在读取或者修改 volatile 变量的过程中,其他线程可能会对这个变量进行修改,但是 volatile 修饰的变量,只是保证了从主内存加载到工作内存的值是最新的,并不能保证对变量的操作是原子性的。如果不加volatile,因为初始化一个对象分为:分配内存空间,初始化对象,将对象指向分配的内存空间这三步,不加volatile ,对变量的修改,其他线程不可见,下面代码不加volatile 会卡死,加上才能正常执行。读屏障:在读取 volatile 变量时。

2024-01-07 16:49:27 1014

原创 synchronized锁

所以只需要锁在第一次被拥有的时候,记录下线程的id,这样偏向线程会一直持有锁,这个线程后续进入和退出听不代码块的时候,不需要再次加锁和释放锁,而是去检查 mark word 中的偏向线程id是不是自己。偏向锁会偏向于第一个访问到锁的线程,且只有偏向锁被其他线程竞争,持有偏向锁的线程才会释放锁,否则线程是不会主动释放锁的,而对于持有偏向锁的线程也就不需要触发同步,就能在没有资源竞争的情况下消除了同步语句。当线程自旋达到一定次数,仍然没有获得锁,也就是有大量线程在竞争锁,那么就会升级锁为重量级锁。

2024-01-03 22:30:21 1073

原创 JUC原子操作类

对象的属性修改原子类,可以用线程安全的方式操作非线程安全对象内的某些字段,例如:某个对象有多个属性,但是只有少量字段需要频繁更新,加锁虽然可以保证线程安全,但是有可能会锁住整个对象,所以可以用原子更新代替加锁。getProbe()方法,获取线程的hash值,如果返回0,会重新计算一个hash值,重新计算后,认为线程本次操作没有竞争关系,把竞争标志改为 true ,也就是不存在冲突。如果数组的长度 n大于当前cpu的核数,就不可扩容,然后重置当前线程的hash值,让线程重新循环参与竞争。

2024-01-03 21:59:13 852

原创 JUC AQS ReentrantLock源码分析

非公平锁的tryAcquire 方法会先判断锁的状态state是否为0,为0说明没有被其他线程占用,就立即使用cas操作变更state为1,变更成功就把持有锁的线程设置为自己,变更失败就表示加锁失败。AQS类的tryAcquire方法只是做了规范,方法内直接抛出异常,所以这个方法需要由子类去实现。调用lock方法加锁,除非是非公平锁能直接拿到锁,其他情况下都是在调用acquire 方法。如果锁的状态为1,说明锁已经被占用,在比较当前线程和持有锁的线程是否一致,不一致就加锁失败。取消正在进行的获取尝试。

2023-12-23 15:53:03 812

原创 volatile 无法保证原子性 案例展示

变量的写操作和读操作之间是可以被中断的,也就是在读取或者修改 volatile 变量的过程中,其他线程可能会对这个变量进行修改,但是 volatile 修饰的变量,只是保证了从主内存加载到工作内存的值是最新的,并不能保证对变量的操作是原子性的。所以在多线程环境下,对线程的操作结果可能会丢失,想要在多线程情况下修改主内存的共享变量必须加锁来保持同步。在 Java 中,原子性是指一个操作是不可中断的,要么都执行要么都不执行。例如:下面的代码不管加不加 volatile ,执行结果都会出错。

2023-11-19 16:44:35 119

原创 redis分布式锁

- 加锁的目的是为了防止代码的重复执行,在单机情况下,可以使用 jvm的锁:lock和synchronized进行加锁- 但是在分布式系统下,每个jvm是相互隔离的,JVM锁没有互斥性,所以需要引入第三方进行加锁

2023-11-05 16:05:53 254 1

原创 java8 Lambda表达式以及Stream 流

方法引用是对Lambda的进一步简化,本质上就是Lambda表达式,而 Lambda 是函数式接口的实例,所以方法引用也是函数式接口的实例。

2023-10-25 22:36:59 255

原创 redis 布隆过滤器理论及代码实现

Guava 的使用和自己实现的布隆过滤器没有什么区别。这里使用mybatis-plus和mysql。判断布隆过滤器是否存在数据的工具类。Guava布隆过滤器。

2023-07-23 22:04:00 267 2

原创 redis7单节点、主从、哨兵、集群的安装和配置

2022年4月份正式发布的redis 7.0,是目前历史上变化最大的版本,有超过50个以上的新增命令中文镜像redis版本,建议升级到6.0.8版本以上,防止出现安全问题。

2023-07-15 23:08:10 955

原创 ShardingSphere-Proxy 分库分表

提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。对 readwrite_splitting_db 的查询就会落在 slave1 上,写就会落在 db1上,slave1 是db1的从库,readwrite_splitting_db 就是一个代理库。通过springboot整合ShardingSphere-Proxy,不需要添加任何额外的依赖,在配置数据源的时候需要连接上面的逻辑库readwrite_splitting_db。也可以使用可视化工具连接,和正常使用mysql没有区别。

2023-06-24 23:07:09 499

原创 ShardingSphere-JDBC 5.1.1 分库分表

它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。mysql并不能完全利用高性能服务器的硬件,当cpu超过24个,内存超过128G时,mysql性能处于平缓,不在上升,所以在一个性能强大的服务器上运行多个实例,才更合理。如果按照id查询,也就是分片的键,能够精确定位数据所在的分片,避免很多不必要的查询,所以分片的键要谨慎选择。订单表和订单详情表,使用相同的分库分表策略,保证相关的数据在一个库中,避免跨库的关联查询。

2023-06-24 23:04:22 1207

原创 redis集群

怎么实现Redis的高可用:Redis 实现高可用有三种部署模式:主从模式,哨兵模式,集群模式。redis主从模式主从模式中,主节点负责读写操作,从节点只负责读操作。从节点的数据来自主节点,原理就是主从复制redis主从数据是异步同步的,当主节点修改数据后立即返回,即使主从网络断开,主节点依然可以对外提供写服务,所以分布式的redis系统满足CAP中的可用性,不满足一致性。

2023-06-05 11:33:22 516

原创 redis基本原理

redis事务执行失败,有两种情况,语法错误或者数据结构类型错误,如果语法错误,那么所有的事务都会执行失败,如果是类型错误,只有错误的那条事务会执行失败,不会导致前面的指令回滚,也不会造成后续指令不执行。redis的每个事务的操作指令都有multi、exec 和 discard,multi代表事务开始,exec 代表事务的执行,discard是指丢弃事务缓存队列中的所有指令。单个redis的命令是原子性的,但是redis的事务是没有原子性的,事务就是一组命令的集合,可以理解为批量执行脚本,

2023-06-05 11:31:42 602

原创 redis数据类型

list、set、Hash、zset都是容器型数据结构,如果容器不存在,那就创建一个,如果容器中没有元素,那么立即删除容器,释放内存,例如list弹出最后一个元素后,list本身就消失了。ZSet 有两种不同的实现,分别是 ziplist 和 skiplist。:不满足以上两个条件时使用跳表、组合了 hash 和 skiplist。三种特殊的数据结构类型。

2023-06-05 11:29:40 601

原创 扩展mysql

mysql并不能完全利用高性能服务器的硬件,当cpu超过24个,内存超过128G时,mysql性能处于平缓,不在上升,所以在一个性能强大的服务器上运行多个实例,才更合理。跨节点分页、排序、函数问题,将各个分片的结果集进行汇总和再次计算,最终将结果返回,对于分页查询,每次大量聚合后再分页,性能欠佳。将数据分配到分片中的方法:固定分配和动态分配,两种方法都需要一个分区函数,输入分区键值获得行的分片。mysql常见的扩展方式有:垂直扩展,水平扩展和向内扩展。分布式事务(见seata)

2023-06-05 11:26:38 485

原创 MySQL8.0Linux安装及主从的搭建

需要说明的一点是我使用的是SSH secure shell Client连接linux系统的,它的用法和命令窗口差不多。界面如图:一样的使用Linux命令操作。话不多说第一步:1)、切换到 /usr/local下2)、创建mysql文件夹3)、切换到mysql文件夹下cd mysql84)、下载mysql8.0安装包如果执行没反应,可以复制安装包链接在Windows的浏览器下载好,再用SSH移到 /use/local/mysql文件夹下面(这个时候就提现出了SSH的便利性)

2023-03-08 20:25:55 739 1

原创 innodb存储引擎

表空间(Tablespace):是一个逻辑容器,表空间存储的对象是段,在一个表空间中可以有一个或多个段,但是一个段只能属于一个表空间。区(Extent):是比页大一级的存储结构,在InnoDB存储引擎中,一个区会分配64 个连续的页,也就是64*16KB= 1MB。用户记录,存储行记录的内容,叶子节点就是真正的数据,用户记录中的数据按照指定的行格式排列,相互之间形成单链表。页头,记录了很多页的状态信息,例如槽的数量、记录的数量、第一条记录的地址等。空闲空间,指的是页中还没有使用的空间。

2023-03-05 14:11:15 390

原创 mysql数据类型选择

timestamp可表示范围:1970-01-01 00:00:00~2038-01-09 03:14:07,datetime支持的范围更宽1000-01-01 00:00:00 ~ 9999-12-31 23:59:59。timestamp 储存占用4个字节,更轻量,索引相对datetime更快,记录的时间会跟随设置的时区变化而变化;date保存精度到天,格式为:YYYY-MM-DD,如2016-11-07。between是min和max范围内的,包括min和max,是数字型的。BLOB和TEXT类型。

2023-02-26 19:52:15 385

原创 MySQL的mvcc

当隔离级别为可重复读的时候,就避免了不可重复读,这是因为一个事务只在第一次 SELECT 的时候会 获取一次 Read View,而后面所有的 SELECT 都会复用这个 Read View,可以认为是行级锁的变种,在很多情况下可以避免加锁,开销更低。mvcc没有正式的标准,不同数据库实现方式不一样,也不是普遍使用的,mysql也只有innodb使用了mvcc。这样做的好处是大多数查询都不在需要获取锁了,只需要确保查询符合条件的行即可,mvcc只适用于可重复读 ,和读已提交两个隔离级别,

2023-02-26 17:39:12 305

原创 MySQL事务

write pos和checkpoint之间的是空着的部分,可以用来记录新的操作。checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。在事务中更新数据的前置操作其实是要先写入一个undo log。redo log是物理日志,记录的是数据页的物理变化,undo log不是redo log的逆过程。InnoDB的redo log是固定大小的,写到末尾时候会回到开头循环写,文件可以复写,undo log是逻辑日志,对事务回滚时,只是将数据库逻辑地恢复到原来的样子。

2023-02-21 23:02:42 232

原创 Mybatis流式查询并将结果分批写入文件

以mybatis-plus的方式。

2023-02-19 17:33:36 566

原创 mysql EXPLAIN关键字

查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。rows 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,也就是说,用的越少越好。select_type,表示查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。id:select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。

2023-02-18 23:07:27 372

原创 mysql索引

innodb只有再访问行的时候才会加锁,索引可以减少访问的行数,从而减少锁的数量,但是如果索引不能有效过滤掉无效的行,再数据返回给服务器层后,mysql才能使用where字句,这时就无法避免的会锁定行。在检索数据时从联合索引的最左边开始匹配,组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到。重复索引是指在相同列上按照相同顺序建立的相同类型的索引,应该避免创建重复索引,发现之后应该立即移除。随着偏移量的增加,需要花费大量的时间来扫描需要丢弃的数据,缓存和提前计算是仅有的策略。

2023-02-16 22:58:12 359

原创 mysql缓冲池和写缓冲

change buffer就是在非唯一普通索引页不在buffer pool中时,对页进行了写操作的情况下,先将记录变更缓冲,等未来数据被读取时,再将 change buffer 中的操作merge到原数据页的技术。在MySQL5.5之前,叫插入缓冲(insert buffer),只针对insert做了优化;现在对delete和update也有效,叫做写缓冲(change buffer)。LRU 算法存在的问题:预读失效和Buffer Pool 污染。Buffer_Pool【缓冲池,简称BP】

2023-02-12 17:48:35 587

原创 mysql可扩展性和高可用

mysql并不能完全利用高性能服务器的硬件,当cpu超过24个,内存超过128G时,mysql性能处于平缓,不在上升,所以在一个性能强大的服务器上运行多个实例,才更合理。因为地理位置、预算等,单点失效并不是总能消除的,任何一个不冗余的地方,都有是一个可能失效的单点,包括硬盘、服务器、甚至一个数据中心。将数据分配到分片中的方法:固定分配和动态分配,两种方法都需要一个分区函数,输入行的分区键值获得行的分片。所有的宕机都是多方面原因造成的,在系统中建立冗余,保证单点的安全,打断整个链条,避免服务完全失效。

2023-02-11 23:05:51 882

原创 mysql的复制和备份

两种方式也都是通过在主库上记录二进制日志,在备库重放日志的方式来实现异步的数据复制,所以同一时间点主库和从库的数据可能不一致,而且无法保证主从之间的延迟。两种模式都有优缺点,mysql可以自动在两种模式间切换,默认使用的是基于语句的复制,但是如果发现语句无法被正确复制,就会使用基于行的模式。关闭系统做离线备份,是最简单也是最安全的,数据损坏和不一致的风险也最小,但是让服务器停机的代价可能会很高,所以必须要使用不停机备份。mysql复制的方式有:基于行的复制和基于语句的复制。mysql的备份方式。

2023-02-11 16:33:18 760

原创 mysql的分区和视图

分区表分区表是一个独立的逻辑表,底层由多个物理子表组成,从存储引擎的角度来看,底层表和普通表没有任何区别每一个分区表都会有一个使用 # 分隔命名的表文件分区表的索引也是按照分区的子表定义的,没有全局索引,分区表的索引也只是再各个底层表中加上完全相同的索引mysql再创建表的时候通过 partition by 字句定义每个分区存放的数据,分区表达式可以是列,也可以是包含列的表达式再执行查询的时候,优化器会根据分区定义过滤不需要的分区,只查找包含需要数据的分区。

2023-02-11 16:13:36 466

原创 mysql的锁

MySQL默认隔离级别为:可重复读 (Repeated read),Oracle默认隔离级别为:读已提交(READ COMMITTED)事务日志可以提高事务效率,使用事务日志,存储引擎在修改表的数据的时候,只需要修改内存拷贝,再把修改行为持久化到硬盘上的事务日志,内存中的数据在后台可以慢慢的刷回磁盘,不用每次都将修改的数据本身持久化到磁盘,也就是修改数据其实需要写两次磁盘。事务日志采用的是追加的方式,是顺序I/O。

2023-02-11 16:12:13 463

原创 sql语句的优化

如果想要统计的是结果集的行数,count(*)会忽略所有的列,直接统计行数,语义清晰,性能也会很好,MyISAM保存了表的行数,直接使用 count( *)会很快,但是前提是没有where条件。扫描索引是很高效的,但是如果索引不能覆盖查询所需要的列,就需要回表去查询对应的列,这基本上就是随机i/o,这种比顺序全表扫描还慢。另外在应用层做关联,一条数据只需要查询一次,而在数据库查询,可能需要重复的访问一部分数据,查询本身的效率可能会有所提升。在其他条件都相同的时候,尽可能少的查询当然更好,

2023-02-11 16:11:32 565

原创 mysql一条sql语句的执行过程

在解析一个查询语句之前,如果查询缓存是打开的,那么会优先检查这个查询是否命中查询缓存中的数据,如果命中,就立刻返回结果,跳过解析、优化和执行阶段。在判断缓存是否命中的时候,mysql不会解析sql语句,而是直接使用客户端发送过来的原始信息进行对比,任何字符上的不同,都会导致缓存不命中。应用程序不需要关心是通过查询缓存返回的结果还是实际执行查询返回的结果,因为两者的结果是完全相同的,而且查询缓存也不需要使用任何语法。mysql使用的是基于成本的优化器,它会预测执行一个某种执行计划的成本,然后选择最小的一个。

2023-02-11 16:09:37 2535 2

原创 mysql函数

函数函数可以把我们经常使用的代码封装起来, 需要的时候直接调用即可。这样既 提高了代码效率 ,又 提高了可维护性。在 SQL 中我们也可以使用函数 对检索出来的数据进行函数操作。使用这些函数,可以极大地 提高用户对数据库的管理效率。不同DBMS函数的差异 我们在使用 SQL 语言的时候,不是直接和这门语言打交道,而是通过它使用不同的数据库软件,即 DBMS。DBMS 之间的差异性很大,远大于同一个语言不同版本之间的差异。实际上,只有很少的函数是 被 DBMS 同时支持的。

2023-01-02 22:49:20 244

原创 Dubbo前后端分离监控中心搭建

监控中心,因为监控中心现在前后端分离,所以相比与老版有变动,首先下载压缩包官网: https://github.com/apache/dubbo-admin/tree/develop下载安装包,使用IDEA打开解压好的文件夹,稍等片刻让Maven下载好相关依赖首先调整项目为:jdk8编辑模块下的配置文件:然后打开IDEA右侧的maven面板,如果没有面板点击IDEA左下角的小方块就可以找到,点击maven面板的闪电图标,跳过单元测试,然后依次双击 对进行打包这里的账号密码就是前端页面的登录密码将jar包

2022-12-03 22:03:02 583

原创 springboot+zookeepr+dubbo的远程服务调用

首先一定确保zookeeper正常工作为了简化代码,可以把需要其他服务调用的接口,抽取为公共接口模块dubbo-common-service,服务提供方导入dubbo、zookeeper依赖配置文件为:提供方实现接口并暴露服务,在接口实现类增加@DubboService启动类加上@EnableDubbo接口调用方启动类controller接口通过本服务的Service 来远程调用接口访问controller接口,得到:远程调用成功

2022-12-03 21:56:48 252

原创 clickHouse基础语法

​ 粒度,指的是在一级索引的前提下,在记录数据的粒度,比如说,有很多重复的数据,一级索引记录的区间为1-10,10-20,20-50等,想要判断35数据在哪一个区间,就需要判断3次,这里的粒度是5,也就是把五个区间合并为一个二级索引,使得区间的范围更大,查找更高效,也就是对于一级索引粒度的粒度。主键提供的索引为稀疏索引,默认间隔为8192,除非有大量的重复值,一般不需要改这个值,可以减少索引文件的大小,以及快速定位,但是没办法避免在一个区间内的扫描。

2022-11-27 20:48:51 1320

原创 clickhouse单节点以及集群的安装

​ 在clickhouse集群中,没有主从一说,所有的节点都是主,相互之间互为副本,某一个节点的数据发生变化,就会提交写日志给zookeeper,其他节点就会从zookeeper监听到数据发生了变化,然后从数据发生变化的节点同步数据。Centos取消SELINUX(linux的一种安全机制,非常强大,但是也非常麻烦),是内核级别的东西,必须重启,也可以设置为临时生效,等下次服务器维护重启,配置自然也生效了。分片,下面是资源不够用的情况,只有3个节点,没有副本。在 中编辑。

2022-11-27 20:43:30 2074

原创 zookeeper+openfeign远程调用

首先确保zookeeper集群可用。

2022-11-20 21:41:17 742

原创 zookeeper3.8.0集群安装及基础命令

zookeeper数据模型与Uinx文件系统很相似,整体可以看作是一棵树,每个节点 默认能够存储1MB数据,每个节点都可以通过文件路径来唯一标识。服务器操作:创建服务器连接,将自己注册到zookeeper集群(也就是创建对应的节点,上线一台服务器就创建一个节点,下线节点就消失)通过通信的线程将注册的监听事件发送给zookeeper ,再zookeeper的注册监听列表中将注册的监听事件添加到列表中。再一个mian线程里,创建zookeeper客户端,会有两个线程,一个负责网络通信,一个负责监听。

2022-11-20 21:30:38 1403

原创 java虚拟机垃圾回收器

垃圾回收器是java的招牌能力,极大的提高了开发效率7款经典的垃圾回收器:串行回收器:Serial、 Serial old (垃圾回收时,只有一个线程进行垃圾回收)并行回收器:ParNew 、Parallel Scavenge 、 Parallel old (垃圾回收时,有多个垃圾回收线程)并发回收器:CMS、G1 (垃圾回收线程和工作线程交替执行)不同的垃圾回收器可以回收的不同区域不同的jdk版本,垃圾收集器的组合方式。...

2022-08-28 21:31:07 893 1

空空如也

空空如也

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

TA关注的人

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