- 博客(31)
- 资源 (1)
- 收藏
- 关注
原创 一个SQL查询出表结构
truncate(data_length / 1024 / 1024,2) as “数据容量(MB)”,truncate(index_length / 1024 / 1024, 2) as “索引容量”select table_schema as “数据库”,where table_schema = ‘数据库名’and table_name = ‘数据库中的表名’table_rows as “记录数”,table_name as “表名”,
2024-07-02 20:11:02 238
原创 mysql8.0高可用集群架构实战
InnoDB Cluster是MySQL官方实现高可用+读写分离的架构方案,其中包含以下组件MySQL Group Replication,简称MGR,是MySQL的主从同步高可用方案,包括数据同步及角色选举Mysql Shell 是InnoDB Cluster的管理工具,用来创建和管理集群Mysql Router 是业务流量入口,支持对MGR的主从角色判断,可以配置不同的端口分别对外提供读写服务,实现读写分离。
2024-04-09 16:23:48 2197
原创 mysql8主从复杂原理分析
MySQL 复制(Replication) 是官方提供的主从复制(源到副本的复制)方案,用于将一个 MySQL 的实例同步到另一个实例中。这是使用最广泛的容灾方案(重点掌握)。
2024-04-09 09:36:14 945
原创 mysql事务隔离级别
概述:我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能会导致我们所说的脏写、脏读、不可重复读、幻读这些问题。为了解决这些问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。
2024-04-08 10:59:43 633
原创 MySQL1
MySQL5.6后引入索引下推,在索引遍历的过程中,对索引中包含的所有字段先做判断,过滤掉不符合条件的记录后再回表,减少回表的次数。在联合索引中匹配到name是A开头的索引后,同时会在索引里过滤掉age和positon这两个字段,拿着过滤完剩下的索引对应的主键id再回表查询整行数据。按照最左前缀原则,这种情况只有name字段走索引,得到的age和position是无序的,mysql5.6之前只能拿A开头的索引对于的主键逐个回表,到主键索引上找出对于的记录,再对比age和postion这两个字段是否符合。
2024-03-20 16:09:19 868
原创 spring
synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。
2024-03-14 14:17:19 895
原创 mysql
他们共一个xid数据字段,崩溃的时候先扫描redolog,如果碰到既有prepare,又有commit的redolog,直接提交,如果碰到只有prepare,没有commit的redolog,则通过xid去binlog找对应的事务。3、引擎将这行数据更新到内存中,同时将这个更新操作记录到redolog里面,此时redolog里面,此时redolog处于prepare状态,然后告知执行器执行完成了,随时可以提交事务。binlog是可以追加写的,写的一定大小后切换到下一个,不会覆盖以前的日志。
2024-03-12 14:25:28 360
原创 2、Spring Security Oauth2
OAuth 2.0 (Open Authorization)是一种开放标准的授权协议,允许用户授权第三方应用访问其在某个服务提供者上的受保护资源,而无需将其实际的凭证(如用户名和密码)分享给第三方应用。这种方式可以增加安全性,同时允许用户更好地控制其数据的访问权限。OAuth 2.1去掉了OAuth2.0中的密码模式、简化模式,增加了设备授权码模式,同时也对授权码模式增加了PKCE扩展。OAuth 2.1 的变化:有道云笔记。
2024-03-01 09:29:25 1070 1
原创 Spring Security
某企业要做前后端分离的项目,决定要用spring boot + spring security+JWT 框架实现登录认证授权功能,用户登录成功后,服务端利用JWT生成token,之后客户端每次访问接口,都需要在请求头上添加Authorization:Bearer token 的方式传值到服务器端,服务器端再从token中解析和校验token的合法性,如果合法,则取出用户数据,保存用户信息,不需要在校验登录,否则就需要重新登录@Slf4j@Component@Autowired@Override。
2023-10-26 15:39:53 195
原创 3、RocketMQ⾼性能核⼼原理分析
这一部分主要是理解RocketMQ一些重要的高性能核心设计。我们知道,在MQ这个领域, RocketMQ实际上是属于一个后起之秀。RocketMQ除了能够支撑MQ的业务功能之外,还有更重要的一部分就是对于高吞吐、高性能、高可用的三高架构设计。这些设计的思想,很多都是我们去处理三高问题时可以学习借鉴的经验。 另外,与RabbitMQ和Kafka这些外国的产品不同,RocketMQ作为国人开发的产品,很多核心实现机制其实是非常符合我们的思想的。
2023-07-30 09:27:39 132
原创 2、RocketMQ的消息模型
在通过 producer.sendMessageInTransaction发送事务消息后,如果消息发送成功,就会调用到这里的executeLocalTransaction方法,来执行本地事务。如果是返回未知状态,RocketMQ Broker服务器会以1分钟的间隔时间不断回查,直至达到事务回查最大检测数,如果超过这个数字还未查询到事务状态,则回滚此消息。值得注意的是,如果发送事务消息,在这里我们的创建的实例必须是 TransactionMQProducer。上面的代码中,主要就是创建事务消息的发送者。
2023-07-28 16:09:47 1456
原创 1、MQ简介和部署
MQ:MessageQueue,消息队列。是在互联⽹中使⽤⾮常⼴泛的⼀系列服务中间件。这个词可以分两个部分来看,⼀是Message:消息。消息是在不同进程之间传递的数据。这些进程可以部署在同⼀台机器上,也可以分布在不同机器上。⼆是Queue:队列。队列原意是指⼀种具有FIFO(先进先出)特性的数据结构,是⽤来缓存数据的。对于消息中间件产品来说,能不能保证FIFO特性,尚值得考量。但是,所有消息队列都是需要具备存储消息,让消息排队的能⼒。
2023-07-28 12:32:11 1434
原创 1、MySQL集群架构搭建以及多数据源管理实战
数据库的分库分表操作,这是互联网大型应用所需要面对的最核心的问题。因为数据往往是一个应用最核心的价值所在。但是,在最开始的时候,我会给你强调,在实际应用中,对于数据库,**能不分就不分!!!**这也应该是你未来准备对你的应用下手进行分库分表之前需要考量的宗旨。为什么一上来就会要给你们泼这样一盆冷水呢?这就需要你提前思考清楚,为什么要分库分表。
2023-05-22 11:00:48 593
原创 6、Redis高级数据结构HyperLogLog
HyperLogLog基于概率论中伯努利试验并结合了极大似然估算方法,并做了分桶优化。实际上目前还没有发现更好的在大数据场景中准确计算基数的高效算法,因此在不追求绝对准确的情况下,使用概率算法算是一个不错的解决方案。概率算法不直接存储数据集合本身,通过一定的概率统计方法预估值,这种方法可以大大节省内存,同时保证误差控制在一定范围内。目前用于基数计数的概率算法包括:Linear Counting(LC):早期的基数估计算法,LC在空间复杂度方面并不算优秀;
2023-04-22 23:41:25 268
原创 5、Redis缓存设计和性能优化、stream队列、多线程
缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,通常出于容错的考虑,如果从存储层查不到数据则不写入缓存层缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义造成缓存穿透的基本原因有两个:1、自身业务代码或者数据出现问题2、一些恶意攻击,爬虫等造成大量空命中缓存穿透问题的解决方案1、缓存空对象2、布隆过滤器。
2023-04-22 22:08:05 602
原创 4、Redis高并发分布式锁
以上代码在高并发下,不能保证原子性,为了保证原子性,可以使用redisson来实现1、导包2、交给springIOC容器实例化3、代码实现在application.yml修改port来部署两个相同的服务,端口不同。然后修改Nginx的配置文件可以使用jemeter压测查看日志是否多扣。
2023-04-22 02:01:17 153
原创 3、Redis缓存高可用集群
在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。
2023-04-19 22:34:09 94
原创 2、Redis持久化和主从、哨兵
在默认情况下,Redis将内存数据库快照保存在名字为dump.rdb的二进制文件中在redis.conf文件中修改位置:例如save 60 10000表示60秒内至少有10000个键被改动,自动保存一次数据集。如果想关闭rdb,则把这三行注释掉就可以。除了上面的自动保存,还可以手动执行命令生成rdb快照,进入redis客户端,redis-cli,执行save或者bgsave可以生成dump.rdb文件,每次命令执行都会将所有的redis内存快照到一个新的rdb文件里,并覆盖原有的rdb快照文件。
2023-04-19 14:27:14 123
原创 10、阻塞队列BlockingQueue实战及其原理分析
LinkedBlockingQueue是一个基于链表实现的阻塞队列,默认情况下,该阻塞队列的大小为Integer.MAX_VALUE,由于这个数值特别大,所以 LinkedBlockingQueue 也被称作无界队列,代表它几乎没有界限,队列可以随着元素的添加而动态增长,但是如果没有剩余内存,则队列将抛出OOM错误。和它不同的是,LinkedBlockingQueue 的内部是用链表实现的,所以这里就需要我们考虑到,ArrayBlockingQueue 没有链表所需要的“节点”,空间利用率更高。
2023-03-21 00:10:38 291
原创 9、并发容器(Map、List、Set)实战及其原理
Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。所以,Java先提供了同步容器供用户使用。同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector、Hashtable以及SynchronizedList等容器。这样做的代价是削弱了并发性,当多个线程共同竞争容器级的锁时,吞吐量就会降低。因此为了解决同步容器的性能问题,所以才有了并发容器。
2023-03-20 23:54:54 535
原创 8. 读写锁ReentrantReadWriteLock&StampLock详解
读写锁ReadWriteLock,顾名思义是一把分为读和写两部分的锁,读锁允许多个线程同时获得,因为读操作本身是线程安全的。而写锁是互斥锁,不允许多个线程同时获得写锁。并且读和写操作也是互斥的。读写锁适合读多写少的业务场景。针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,它内部,维护了一对相关的锁,一个用于只读操作,称为读锁;一个用于写入操作,称为写锁,描述如下:没有其他线程的写锁没有写请求或者有写请求,但调用线程和持有锁的线程是同一个。
2023-03-20 23:09:30 447
原创 7、ReentrantLock
java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。JDK中提供的大多数的同步器如Lock, Latch, Barrier等,都是基于AQS框架来实现的一般是通过一个内部类Sync继承 AQS将同步器所有调用都映射到Sync对应的方法AQS具备的特性。
2023-03-20 22:55:12 59
原创 6.JUC并发工具类
限流:Semaphore可以用于限制对共享资源的并发访问数量,以控制系统的流量。资源池:Semaphore可以用于实现资源池,以维护一组有限的共享资源。并行任务同步:CountDownLatch可以用于协调多个并行任务的完成情况,确保所有任务都完成后再继续执行下一步操作。多任务汇总:CountDownLatch可以用于统计多个线程的完成情况,以确定所有线程都已完成工作。资源初始化:CountDownLatch可以用于等待资源的初始化完成,以便在资源初始化完成后开始使用。
2023-03-19 20:59:33 126
原创 4、并发安全问题
什么是线程安全性?我们可以这么理解,我们所写的代码在并发情况下使用时,总是能表现出正确的行为;反之,未实现线程安全的代码,表现的行为是不可预知的,有可能正确,而绝大多数的情况下是错误的。如果要实现线程安全性,就要保证我们的类是线程安全的的。在《Java并发编程实战》中,定义“类是线程安全的”如下:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在调用代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。
2023-03-19 14:48:15 190
原创 3、CAS详解
实现原子操作可以使用锁,锁机制,满足基本的需求是没有问题的了,但是 有的时候我们的需求并非这么简单,我们需要更有效,更加灵活的机制, synchronized 关键字是基于阻塞的锁机制,也就是说当一个线程拥有锁的时候, 访问同一资源的其它线程需要等待,直到该线程释放锁, 这里会有些问题:首先,如果被阻塞的线程优先级很高很重要怎么办?这些原子操作类其实是使用当前的处理器基本都支持 CAS 的指令,比如 Intel 的汇编指令 cmpxchg,每个厂家所实现的具体算法并不一样,但是原理基本一样。
2023-03-19 12:48:11 424
原创 2、导致 JVM 内存泄露的 ThreadLocal
为什么要有ThreadLocal:首先看一段JDBC原生代码可以看到,在使用jdbc的时候,首先要配置后再拿到jdbc连接,然后在增删改查的业务中拿到这个连接,并把我们的SQL语句交给jdbc连接发送到真实的db上执行。在实际的工作中,我们不会每次执行SQL都临时去创建连接,而是会借助连接池,同时因为实际业务的复杂性,为了保证数据的一致性,我们还会引入事务操作,于是上面的代码就会变成:但是上面的代码开启事务后和执行insert操作会获取两个连接,导致事务失效。
2023-03-18 20:45:32 95
原创 1、从 0 开始深入理解并发、线程与等待通知机制
当然可以,用我们平时常用的 QQ 之类的聊天程序来举例,当我们用QQ 聊天时,其实程序要做好几件事,比如:接受我们的键盘输入,把输入的信息通过网络发给对方,接受对方通过网络发来的信息,把对方的信息显示在屏幕上,很多的时候,这些事情是可以同时发生的。如果设计一个多线程的程序的话,那它就可以同时在多个CPU 的多个核的多个线程上跑,可以充分地利用 CPU,减少 CPU 的空闲时间,发挥它的运算能力,提高并发量。比如我们经常用的迅雷下载,都喜欢多开几个线程去下载,谁都不愿意用一个线程去下载,为什么呢?
2023-03-17 15:14:58 207
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人