mysql事务原理
一、Redo LogMySQL 中事务的原子性和持久性是由 Redo Log 实现的,它确保 MySQL 事务提交后,事务所涉及的所有操作要么全部执行成功,要么全部执行失败
1.Redo Log 基本概念Redo Log 也被称作重做日志,它是在 InnoDB 存储引擎中产生的,用来保证事务的原子性和持久性。Redo Log 主要记录的是物理日志,也就是对磁盘上的数据进行的修改操作。Redo Log 往往用来恢复提交后的物理数据页,不过只能恢复到最后一次提交的位置
Redo Log 通常包含两部分:一部分是内存中的日志缓冲,称作 Redo Log Buffer,这部分日志比较容易丢失,另一部分是存放在磁盘上的重做日志文件,称作 Redo Log File,这部分日志是持久化到磁盘上的,不容易丢失
2.Redo Log 基本原理Redo Log 能够保证事务的原子性和持久性,在 MySQL 发生故障时,尽力避免内存中的脏页数据写入数据表的 IBD 文件。在重启 MySQL 服务时,可以根据 Redo Log 恢复事务已经提交但是还未写入 IBD 文件中的数据,从而对事务提交的数据进行持久 ...
阿里higress 介绍
1. 云原生网关Higress介绍
1.1 Higress是什么
Higress是基于阿里内部的Envoy Gateway实践沉淀、以开源Istio + Envoy为核心构建的下一代云原生网关,实现了流量网关 + 微服务网关 + 安全网关三合一的高集成能力,深度集成Dubbo、Nacos、Sentinel等微服务技术栈,能够帮助用户极大的降低网关的部署及运维成本且能力不打折;在标准上全面支持Ingress与Gateway API,积极拥抱云原生下的标准API规范;同时,Higress Controller也支持Nginx Ingress平滑迁移,帮助用户零成本快速迁移到Higress。
****
1.2 Higress快速开始
基于docker compose安装Higress
使用独立部署的 Nacos
-
1curl -fsSL https://higress.io/standalone/get-higress.sh | bash -s -- -c nacos://192.168.65.174:8848 -p admin
启动成功后,本机端口占用情况如下:
80端口: ...
JVM内存调优
java 应用的内存优化一部分在jvm的调优,本篇主要讲述 内存溢出的问题定位和问题分析 相关的的方式方法。
详细的 jvm部分优化可以参考文章: JVM 相关汇总
内存泄漏 内存泄漏(memory leak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。 少量的内存泄漏可以容忍,但是如果发生持续的内存泄漏,就像滚雪球雪球越滚越大,不管有多大的内存迟早会被消耗完,最终导致的结果就是内存溢出。但是产生内存溢出并不是只有内存泄漏这一种原因。 内存泄漏绝大多数情况都是由堆内存泄漏引起的,没有特别说明则讨论的都是堆内存泄漏。
常见的复现场景
java后端应用处理完请求后没有删除用户相关数据,导致随着访问量增大内存占满后OOM;
一些离线的调度任务(Elastic-job、Quartz)
解决内存溢出问题1. 排查和发现问题常用工具
visualVM 可视化的jvm内存分析工具,随jdk一起;
优点:功能丰富,实时监控CPU、 内存、线程等详细信息
缺点: -适用于开发、测试环 ...
Java“并发”常见问题概述
进程和线程区别? 进程是操纵系统的一个概念,用于直接分配内存运行程序的一个标识。即,每一个运行的程序。线程是由进程创建的,一个进程可以创建多个线程,每个线程有自己独立的程序控制流程。
线程的生命周期:
**初始(NEW)**:线程被构建,还没有调用 start()。**运行(RUNNABLE)**:包括操作系统的就绪和运行两种状态。**阻塞(BLOCKED)**:一般是被动的,在抢占资源中得不到资源,被动的挂起在内存,等待资源释放将其唤醒。线程被阻塞会释放CPU,不释放内存。**等待(WAITING)**:进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。**超时等待(TIMED_WAITING)**:该状态不同于WAITING,它可以在指定的时间后自行返回。**终止(TERMINATED)**:表示该线程已经执行完毕。
创建线程的方法
通过扩展Thread类来创建多线程
通过实现Runnable接口来创建多线程
实现Callable接口,通过FutureTask接口创建线程。
使用Executor框架来创建线程池。
1234567891011121314151 ...
HashMap 源码解析
1.HashMap集合简介HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。
JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突**(两个对象调用的hashCode方法计算的哈希码值一致导致计算的数组索引值相同)而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(或者红黑树的边界值,默认为 8)并且当前数组的长度大于64时,此时此索引位置上的所有数据改为使用红黑树存储。**
补充:将链表转换成红黑树前会判断,即使阈值大于8,但是数组长度小于64,此时并不会将链表变为红黑树。而是选择进行数组扩容。
这样做的目的是因为数组比较小,尽量避开红黑树结构,这种情况下变为红黑树结构,反而会降低效率,因为红黑树需要进行左旋,右旋,变色这些操作来保持平衡 。同时数组长度小于 ...
Java 基础试题1
java 基本语法Java是一门面向对象的编程语言 。
平台独立,可移植。 class 一次编译到处运行;
强类型语言,编译时检查,必须显示声明方法;
异常处理;
跨平台(java虚拟机);
java与c++区别
Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Object,C++ 兼容 C ,不但支持面向对象也支持面向过程。
Java 通过虚拟机从而实现跨平台特性, C++ 依赖于特定的平台。
Java 没有指针,它的引用可以理解为安全指针,而 C++ 具有和 C 一样的指针。
Java 支持自动垃圾回收,而 C++ 需要手动回收。
Java 不支持多重继承,只能通过实现多个接口来达到相同目的,而 C++ 支持多重继承。
jvm/jre/jdk
jvm : 虚拟机,class文件的运行环境;
jre :java运行时环境,一个提供java运行的环境,包含编译后的jdk和jvm
jdk: java dev kit (java 开发工具),一个包含常用开发工具与包的合集。
编译型语言和解释型语言
编译型语言: 运行前编译为二进制文 ...
JVM 常见问答题
什么是增量式垃圾收集?首先, G1的堆内存不再单纯划分为年轻代和老年代, 而是划分为多个( 通常是 2048个) 可以存放对象的小块堆区域( smaller heap regions) 。每个小块, 可能一会被定义成 Eden 区, 一会被指定为 Survivor 区或者 Old 区。这样划分之后, 使得 G1 不必每次都去回收整个堆空间, 而是以增量的方式来进行处理: 每次只处理一部分内存块, 称为此次 GC 的回收集( collection set) 。下一次GC时在本次的基础上, 再选定一定的区域来进行回收。 增量式垃圾收集的好处是大大降低了单次GC暂停的时间。
什么是GC停顿(GC pause)?STW因为GC过程中, 有一部分操作需要等所有应用线程都到达安全点, 暂停之后才能执行,这时候就叫做GC停顿, 或者叫做GC暂停。
如果CPU使用率突然飙升, 你会怎么排查?缺乏经验的话, 针对当前问题, 往往需要使用不同的工具来收集信息,例如:ps ‐ef jps ‐vfree ‐m free ‐h top收集不同的指标( CPU, 内存, 磁盘IO, 网络等等)分析应用日志分析GC ...
JVM 相关汇总
jvm 概念JVM(Java虚拟机)是一个抽象的计算模型。就如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域。目的是为构建在其上运行的应用程序提供一个运行环境。JVM可以解读指令代码并与底层进行交互:包括操作系统平台和执行指令并管理资源的硬件体系结构。
一种提供了 java 字节码文件运行的环境,独立与平台之上,包含jvm规范和jvm实现两大部分。
与jdk,jre区别: jdk 是一套泛指java开发的工具库(里面当然包含了jre和jvm)jre 是java运行时环境,jvm+java标准库
jvm厂商有哪些? oracleJDK 和openJDK 区别?
oraclejdk 和openjdk 都实现了java虚拟机的规范不同在于:
工具套件略有差别
某些协议与配置不同,如 美国出口限制的加密算法等。
api 细微的差别;
使用哪个版本
目前LTS 有2个流行的版本: java8 和 java11 建议这两种选择
java11 有更强的性能,支持更多特性,也在近些年的维护和验证中处于稳定。
无论是哪个版本,请保证 各个环境的jdk版本一致, ...
python 基础题
题目001: 在Python中如何实现单例模式。
点评:单例模式是指让一个类只能创建出唯一的实例,这个题目在面试中出现的频率极高,因为它考察的不仅仅是单例模式,更是对Python语言到底掌握到何种程度,建议大家用装饰器和元类这两种方式来实现单例模式,因为这两种方式的通用性最强,而且也可以顺便展示自己对装饰器和元类中两个关键知识点的理解。
方法一:使用装饰器实现单例模式。
12345678910111213141516171819from functools import wrapsdef singleton(cls): """单例类装饰器""" instances = {} @wraps(cls) def wrapper(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] r ...
python 项目的部署
准备上线
上线前的检查工作。
1python manage.py check --deploy
将DEBUG设置为False并配置ALLOWED_HOSTS。
12DEBUG = FalseALLOWED_HOSTS = ['*']
安全相关的配置。
123456789101112131415161718192021# 保持HTTPS连接的时间SECURE_HSTS_SECONDS = 3600SECURE_HSTS_INCLUDE_SUBDOMAINS = TrueSECURE_HSTS_PRELOAD = True# 自动重定向到安全连接SECURE_SSL_REDIRECT = True# 避免浏览器自作聪明推断内容类型SECURE_CONTENT_TYPE_NOSNIFF = True# 避免跨站脚本攻击SECURE_BROWSER_XSS_FILTER = True# COOKIE只能通过HTTPS进行传输SESSION_COOKIE_SECURE = TrueCSRF_COOKIE_SECURE = True# 防止点击劫持攻击手段 - 修改HTTP ...