- 博客(37)
- 收藏
- 关注
原创 Redis高可用(五)- 集群
Redis集群:存储能力受单机限制,以及无法实现写操作的负载均衡。集群(Redis Cluster),是Redis 3.0开始引入的分布式存储方案。由多个节点(Node)组成,Redis的数据分布在这些节点中;集群中的节点分为主节点和从节点:只有主节点负责读写请求!!和集群信息的维护;从节点负责高可用,只进行主节点数据和状态信息的复制。为什么从节点只负责高可用?不进行读操作?slot的事根据 master 的地址构建的,因此可以知晓 RedisCluster 从节点是不提供读服务,只做高可用。你觉得Redi
2022-06-29 14:48:03
930
1
原创 Redis高可用(四)- 哨兵
Redis哨兵:基于Redis主从复制,主要作用便是解决主节点故障恢复的自动化问题。Redis Sentinel,即Redis哨兵,Redis 2.8版本开始引入;哨兵的核心功能是主节点的自动故障转移。哨兵的四个作用:客户端:只要通过API访问redis服务器,都会称作客户端,包括redis-cli、Java客户端Jedis等。其中,监控和自动故障转移功能,使得哨兵可以及时发现主节点故障并完成转移;而配置提供者和通知功能,则需要在与客户端的交互中才能体现。 哨兵节点:哨兵系统由一个或多个哨兵节点组成,特殊的
2022-06-29 14:05:44
2561
原创 Redis高可用(三)- 主从复制
主从复制:将数据从一台机复制到另一台机。前者为主节点(master),后者为从节点(slave);数据的复制是单向的,只能从主节点到从节点。默认情况下,每台Redis服务器都是主节点,一个主节点可以有多台从节点,一个从节点只能有一个主节点。复制是单向的,复制就会带来数据一致性问题,无可避免,尽量缩短。主从复制需要在从节点发起,不需要在主节点做任何事情,有三种方式: 通过slaveof no one断开,从节点断开链接,不会删除已有的数据,只是不再接受主节点新的数据变化。清除保存的主库的runid,当下一次执
2022-06-29 13:52:53
790
原创 Redis高可用(二)- 持久化
持久化:解决单机备份问题。Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,所以定期将Redis中的数据或写命令从内存保存到硬盘,重启时利用持久化文件实现数据恢复。Redis持久化方式有两种:RDB持久化是将当前进程中的全量数据生成快照保存到硬盘,也称作快照持久化,保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。RDB持久化的触发分为两种:手动触发、自动触发。手动触发:1.save命令:阻塞Redis服务器主进程,服务器不能处理任何命令请求,直到RD
2022-06-29 13:02:29
1586
原创 Redis高可用(一)- 概述
在Redis服务中,保证服务高可用是非常重要的,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不会丢失等。Redis中,实现高可用的技术主要包括:读操作:主从库都可以执行;写操作:先在主库执行,再由主库将写操作同步给从库。主库数据同步从库的方式有两种:全量同步+增量同步通常是主从服务器刚刚连接的时候,会先进行全量同步。 为了分担主库生成 RDB 文件和传输 RDB 文件压力,提高效率,可以使用 “主 - 从 - 从”模式将主库生成 RDB 和传输 RDB 的压力,以级联
2022-06-29 12:37:33
126
原创 JVM(十) - 性能调优
性能调优包含多个方面:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。其中架构调优和代码调优是基础,架构的调优对系统影响最大。性能调优基本步骤:JVM调优是一种手段,但并不一定所有问题都需要通过JVM调优解决,最有效的优化手段是架构和代码层面的优化。所以JVM优化是最后不得已的手段,在架构调优和代码调优后对服务器配置的最后一次"压榨"。所以JVM调优应遵守的原则:官方Java参数文档:https://docs.oracle.com/javase/8/docs/technotes/tools/un
2022-06-23 20:09:26
8760
原创 JVM(九) - 垃圾回收机制
各语言内存操作对比: 语言申请内存释放内存CmallocfreeC++newdeleteJavanew自动释放Java语言的自动内存管理设计最终可以归结为自动化地解决了两个问题:即对象内存的分配和回收。了解JVM是垃圾回收机制,如何有效防止内存泄露、保证内存的有效使用,需要思考三个方向的问题:进行垃圾回收的第一步:什么是垃圾? 没有引用指向的一个对象或多个对象(循环引用)。定位垃圾的方法有两种:引用计数法和可达性分析。Java中将数据类型分为两大类:基本类型和引用类型。如果reference类型数据中存储的
2022-06-23 19:54:51
750
原创 JVM(八) - 虚拟机栈中的栈帧
Jvm内存中栈分两种:本地方法栈 和 虚拟机栈。两者没有本质上的区别,区别在于服务的对象不同。本地方法栈服务于JVM虚拟机的native方法,如JDK安装目录下很多C的文件实现的方法,这些就是native方法。虚拟机栈服务于虚拟机执行的Java方法。栈帧其实就是栈里面的元素,用于支持Java虚拟机进行方法调用和方法执行背后的数据结构。了解它就可以更好地理解Java虚拟机执行引擎是如何运行的。虚拟机栈和栈帧的结构如图: 栈帧的部分信息,如局部变量表、操作数栈、运行时常量池可以通过JVM字节码查看:局部变
2022-06-23 19:26:55
2157
原创 JVM(七) - Jvm内存模型
JVM = 类加载器(classloader) + 运行时数据区域(runtime data area) + 执行引擎(execution engine)类加载器:通过过全限定名加载二进制数据class文件到Jvm内存中,具体原理见类加载文章。Jvm虚拟机在Java程序执行时,会把Jvm内存划分为若干不同区域。这些区域各有用途,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。JDK1.8 中,永久代(方法区)已完全被元数据区(Meatspace)所取代。直接内存/本地内存
2022-06-23 19:17:45
1622
原创 JVM(六) - JIT的逃逸分析
由于解释器在设计和实现上非常简单,且相当低效。为了解决这个问题,JVM提供了即时编译技术:即时编译可以将整个函数体编译成为机器码,有效到避免函数体被解释执行,而是重复执行时(即热点代码)直接执行编译后的机器码即可,大大提示了执行效率。逃逸分析是一种代码分析手段,动态分析创建对象的使用范围。如果一个在方法中创建的对象 ,除了在方法体中还有方法外部的引用,那么在方法执行完之后,由于对象仍有被引用,所以 GC 有可能是无法立即回收的,此现象则是对象发生了逃逸。可以简单理解一个对象并不只存活在一个方法的作用域内。逸
2022-06-23 19:00:30
720
原创 JVM(四) - 执行引擎
JVM架构模型图: 机器码用二进制编码方式表示的指令(010101...等等),叫做机器指令码,也叫硬编码。最初人们采用它编写程序,这就是机器语言。指令指令集不同的硬件平台,各自支持的指令是有差别的。因此每个平台所支持的指令,称之为对应平台的指令集。汇编语言(硬件级别的语言,不能跨平台)高级语言JVM主要负责装载字节码到其内部,但字节码并不能够运行在操作系统之上,因为字节码指令并非机器码,且只能JVM识别,所以为了让Java程序运行起来,JVM中的执行引擎扮演将高级语言翻译为机器语言的角色,以及对字节码优化
2022-06-23 18:49:56
1035
原创 JVM(三) - 类加载
类的加载过程包括了加载、验证、准备、解析、初始化五个阶段,其中验证、准备、解析又合称为连接阶段。在加载的5个阶段加载、验证、准备和初始化这四个阶段发生是按顺序开始的(而不是按顺序进行或完成,因为这些阶段通常都是交叉混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段),而解析阶段则不一定,在某种情况下可以在初始化阶段之后开始,为了支持Java语言的运行时绑定(即动态绑定或晚期绑定)。结束类生命周期的几种场景:虚拟机的类加载机制:Java使用某个未加载的类时,JVM会通过加载class文件、连接(验证、
2022-06-23 17:45:32
314
原创 JVM(一) - 基础
Java8官方文档:https://docs.oracle.com/javase/8/docs/JDK(Java Development Kit):Java开发工具包。JDK是整个 Java 开发的核心,它集成了JRE 和一些好用的小工具(如Javac、JConsole、VisualVM等)。提供用户开发Java程序,内部Javac编译Java文件到Class文件、JConsole调试、VisualVM分析工具、javadoc文档。需要编写、编译Java程序需要用到JDK。JRE(Java Runtime
2022-06-23 17:13:54
385
原创 Redis安装 - mac
1、下载官网地址:https://redis.io/download,下载最新稳定版本。下载压缩包查看:// 切换到下载文件目录cd Downloads// 查看redis下载包ls | grep "redis"2、安装// 将redis-6.2.4.tar.gz 拷贝到 /usr/localsudo cp Downloads/redis-6.2.4.tar.gz /usr/local// 切换到local目录cd /usr/local//..
2021-07-26 09:58:42
188
原创 Mybatis(十一):源码分析-拦截器插件
Mybatis拦截器的实现:官方文档示例:https://mybatis.org/mybatis-3/zh/configuration.html#plugins拦截器用到责任链模式+动态代理+反射机制,拦截器的使用可以在不侵入业务代码的场景下,进行一些数据权限过了、SQL执行时间和性能的监控等等。自定义拦截器类:自定义的拦截器需要实现Interceptor接口,并且在自定义拦截器类上添加@Intercepts注解; 注册拦截器类:mybatis拦截器配置信息,将插件注册到全局配置文件中。使用
2021-07-26 09:51:25
487
原创 Mybatis(十):源码分析-各种缓存装饰类
Mybatis缓存的设计,通过Cache接口实现类:PerpetualCache:永久缓存,只有这唯一一个基础实现(org.apache.ibatis.cache.impl),其他实现类全都是装饰模式(org.apache.ibatis.cache.decorators)持有另一个缓存对象; PerpetualCache里面就是维护着一个本地的HashMap,所以不支持多线程,因为没能实现接口的锁功能,而且内部的map不是并发的map; FifoCache(先进先出缓存策略的缓存装饰类):通过双向队
2021-07-01 16:15:41
177
原创 Mybatis(九):源码分析-本地缓存和二级缓存
CachingExcuxtor:装饰器设计模式:缓存装饰器类,对真正的执行器Exexutor进行装饰实现缓存作用; 属性Executor delegate:委托对象,存储真正操作数据库的Executor执行器对象; 属性TransactionalCacheManager:管理CachingExecutor中使用二级缓存的对象TransactionalCache; TransactionalCache:实现Cache类,装饰了二级缓存对象;事务中需要进行二级缓存的各类数据,缓存数据在事务提交后才会真
2021-07-01 16:07:58
371
原创 Mybatis(八):源码分析-Executor执行SQL脚本
从上篇动态代理对象的方法都调用MapperMethod.execute()中可知,执行不同等SQL命令最终会使用数据库会话对象SqlSession来执行不同的SQL脚本,对应方法如下:INSERT:sqlSession.insert(); UPDATE:sqlSession.update(); DELETE:sqlSession.delete(); SELECT:sqlSession.select() / sqlSession.selectList() / sqlSession.selectCu.
2021-07-01 15:58:43
469
原创 Mybatis(七):源码分析-Mapper接口动态代理对象的方法调用
从官网Demo代码来入手:https://mybatis.org/mybatis-3/zh/getting-started.htmlMapper接口的代理对象(映射器)的方法调用动态代理生成的代理对象,调用的代理对象的任何方法都是执行调用管理器MapperProxy.invoke()方法。// 从 SqlSessionFactory 中获取 SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {
2021-06-28 01:03:14
756
原创 Mybatis(六):源码分析-获取Mapper接口动态代理对象
从官网Demo代码来入手:https://mybatis.org/mybatis-3/zh/getting-started.html根据Mapper.Class对象获取接口的代理对象(映射器)// 从 SqlSessionFactory 中获取 SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) { // 映射代理器,根据Mapper.Class对象获取接口的代理对象 BlogMapper mapp
2021-06-28 00:57:56
968
原创 Mybatis(五):源码分析-构建SqlSeesion对象
SqlSession保存了配置文件内容信息和执行数据库相关的操作。从官网Demo代码来入手:https://mybatis.org/mybatis-3/zh/getting-started.html// 从 SqlSessionFactory 中获取 SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) { BlogMapper mapper = session.getMapper(BlogMappe
2021-06-28 00:50:26
137
原创 Mybatis(四):源码分析-XML配置文件和构建SqlSessionFactory对象
Mybatis官方文档:https://mybatis.org/mybatis-3/zh/index.htmlMybatis源码(3.5.8-SNAPSHOT版本)下载:https://github.com/mybatis/mybatis-3从官网Demo代码来入手:https://mybatis.org/mybatis-3/zh/getting-started.html1、mybatis-config.xml配置文件解析 ,得到输入流;底层使用java.io下的InputStream和
2021-06-28 00:43:54
581
原创 Mybatis(三):Mybatis与Spring整合示例
依赖安装:<!-- 添加Spring-core包 --><dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.1.4.RELEASE</version></dependency><!-- spring -->
2021-06-28 00:14:46
190
原创 MySql(十):InnoDB存储引擎内存和磁盘架构
MySql存储引擎数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作
2021-06-09 09:34:46
466
2
原创 MySql(九): 锁
读锁与写锁:读锁:共享锁、Shared Locks、S锁。加上读锁后,其他事务不能更新该数据,只允许读取该锁数据。写锁:排它锁、Exclusive Locks、X锁。加上写锁后,其他事务不能更新也不能加读锁。select:select操作是不加锁,所以一条数据加上写锁后,仍能通过普通select去查询,不会涉及锁的冲突。一个资源能加多个读锁,但是只能加一把写锁。 X锁 S锁 X锁 冲突(阻塞) ..
2021-06-07 00:05:12
384
2
原创 MySql(七):索引优化
使用索引(索引设计)原则:1、索引key值字节越小越好因为当索引key值占用的字节越小时,每个索引节点上指针大小固定,每个数据块能存的key越多,索引树的高度越低,检索越快。2、ID作为主键且让id自增索引维护涉及到:页分裂、页合并 页分裂指每个磁盘块大小固定,当新增数据在一个已经存满的磁盘块key范围中时,为了插入该新增数据,则会进行磁盘块分成两块。分裂后上层磁盘块需要增加新的key和指针,也有可能上级磁盘块也需要分裂,所以之前的磁盘块及会收到影响。 id自增主键的维护只是往后叠加.
2021-06-04 09:48:13
665
原创 MySql(六):Explain详解
Explain 命令模拟优化器执行Sql语句,分析查询语句或结构的性能瓶颈,在select查询前加上explain关键词,MySql会在本次查询上设置一个标记,只返回执行计划的信息,而不是执行这条Sql语句。注意:如果from中包含子查询,仍会执行该子查询,将结果放入临时表中。Explain的两个变种在早期的MySql版本(5.7之前)中explain的filtered和partitions列,是需要通过下面两个命令查看。explain extended:会在explai..
2021-06-01 12:42:19
1335
原创 MySql(四):数据类型
数据类型(data_type)定义列可以存什么数据已经该数据怎么储存的规则。根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。四大数据类型:数值类型整数类型包含TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT;浮点数类型包含FLOAT、DOUBLE;定点数类型DECIMAL。日期/时间类型:YEAR、TIME、DATE、DATETIME、TIMESTAMP。 字符串类型:CHAR、VARCHAR、BINARY、VARBINARY.
2021-06-01 11:53:50
456
原创 MySql(八):事务实践
事务:事务是不可能分隔的逻辑工作单元,需要保证原子性、隔离性、一致性、持久性的一个或者多个数据库操作称为一个事务。事务具备四个属性(ACID):例:小明向小强转账10元。原子性(Atomicity):事物是一个完整的操作,各个操作不可分,要么都执行,要么都不执行。所以我们把要么全部做,要么全部不做的规则称之为原子性。转账是一个不可分割操作,要么成功,要么失败,不可能存在中间状态(小明转出了,小强没有转入)。隔离性(Isolation):对数据修改的并非事...
2021-05-26 09:56:07
331
原创 MySql(五):索引原理
索引是什么: 数据库中的一种存储数据结构。该数据结构存储表中一列或多列的值,所以索引是基于数据表的列。索引的作用:增快数据的查询效率(减少IO次数和减少每次IO量)。索引的查看:show index from tableName;优点:a、减少服务器需要扫描的数据量(减少IO次数/datapage设计减少每次IO量);b、索引是有序的,将随机的IO变成逻辑上的有序IO。缺点:a、索引占用物理空间(磁盘),以及数据库存储引擎的优化器会选择合适的索引,所以索引不是越多越好
2021-05-24 11:56:31
201
2
原创 MySql(三):基础命令
查看数据库用户:select Host, User, Password from mysql.user;查看用户表信息:desc mysql.user;查询某个用户的信息:select * from mysql.user where user where user = 'root'\G;// \G的作用是将查到的结构旋转90度变成纵向// \g的作用是相当于分号,等效于';'...
2021-05-24 10:50:42
221
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人