数据库redo日志
前言mysql底层是如何保证事务里的数据不丢失的?没错,就是通过redo log。
注意,绝对的数据不丢失是做不到的。我们所谈论的redo log,是针对事务而言。我们只要能保证事务中的数据不丢就行,说简单点就是:redo保证了事务的原子性和持久性。
简单解释下:
原子性:要么都做了,要么都没做。不要只做一半。比如两个人互相转账,不允许出现一个人转了,而另一个人没收到钱的情况。也就是两条update要么全部执行,要么都不执行。
持久性:数据写到磁盘了。当然这个说法不严谨,比如硬盘坏了呢?为了好理解,我就这样写了!redo是什么?
首先明确,redo是InnoDB引擎特有的。记录着事务里对数据的修改。
在mysql中,如果修改了数据,那么事务提交前,首先会被记录成redo日志写入磁盘,并不会去更新bufferpool或者数据库,只有等到事务提交时,才会根据redolog把新数据写入磁盘。这也就是经常说的WAL(Write-Ahead Logging)。
为什么要这么操作?
主要还是考虑到性能的问题,记录redolog是追加写的方式,是顺序IO。而直接更新数据库B+树,用的是随机的IO。 ...
用并查集去解决最小生成树问题
并查集原理并查集本质上是树的父亲表示法,用一个数组去保存当前结点的父结点(如果当前元素是根,那么数组中会存放元素本身)。并查集用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。
下面是Java代码的一个简单实现:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546import java.util.Arrays;public class FindSet { private int[] pre; private int[] rank; // 点的个数 private int size; public FindSet(int size) { this.size = size; pre = new int[size]; for (int i = 0; i < size; i++) { ...
Stream流操作
Java Stream流操作前言Stream流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算。
Stream流是对集合(Collection)对象功能的增强,与Lambda表达式结合,可以提高编程效率、间接性和程序可读性。
而且有句话说的好,如果会stream流,那么你和大数据就只隔了一层纱。所以对它的学习还是有必要的。
Stream流的特点1、代码简洁:函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环
2、多核友好:Java函数式编程使得编写并行程序如此简单,就是调用一下方法
流的创建1.stream创建1Stream<Integer> stream1 = Stream.of(1,2,3,4,5);
2.集合创建1234567List<Integer> integerList = new ArrayList<>();integerList.add(1);integerList.add(2);integerList.add(3);i ...
List集合常见的坑
Java List集合常见的坑Arrays.asList转换基本类型数组的坑在实际的业务开发中,我们通常会进行数组转List的操作,通常我们会使用Arrays.asList来进行转换。
但是在转换基本类型的数组的时候,却出现转换的结果和我们想象的不一致。
1234int[] arr = {1, 2, 3}; List list = Arrays.asList(arr); System.out.println(list.size()); // 1
实际上,我们想要转成的List应该是有三个对象而现在只有一个。这是asList的源码:
123public static List asList(T... a) { return new ArrayList<>(a); }
可以看到,接收的是一个泛型T的参数,而Java的泛型是基于Object的,int[]是一个对象,而int是基本数据类型,不是Object,所以程序会把arr数组当成一个整体传进去。那我们该如何解决呢?
方案一:Java8以上,利用Arrays.stream(arr) ...
动态代理和AOP编程
动态代理代理模式是设计模式的一种,不展开说了,比较基础。这里介绍一下Java的动态代理。
动态代理的两种方式基于接口的JDK动态代理
JDK动态代理是通过Java的反射机制实现的。它要求目标对象实现一个InvocationHandler接口,然后通过java.lang.reflect.Proxy类创建代理对象。代理对象实现了目标接口,并将方法调用委托给一个InvocationHandler接口的实现类。通过在InvocationHandler的实现类中重写invoke()方法,可以在方法调用前后添加额外的逻辑。
基于类的CGLIB动态代理
CGLIB动态代理不要求目标对象实现接口,而是通过字节码技术生成目标对象的子类作为代理对象。CGLIB(Code Generation Library)使用ASM框架直接操作字节码,在运行时生成代理类。通过继承目标类并重写方法,CGLIB代理对象可以拦截方法调用,并在方法调用前后插入自定义逻辑。
以下是两种代理方式的实例代码:
1234567891011121314151617181920212223242526272829303132333435 ...
手写一个简易的RPC框架
用Java手写一个简易的RPC框架涉及的知识点
RPC和HTTP都是应用层的协议,都可以完成服务的远程调用,我个人认为它们最大的区别主要是传输的方式不同,一个是纯文本,另一个是二进制流,从而导致它们应用的场景各不相同。HTTP 协议适用于 Web 应用程序的交互,RPC 协议更多用于分布式系统中服务间的通信。
一个完整的 RPC 框架需要涉及的知识点很多,包括网络通信、序列化和反序列化、动态代理、服务的注册和发现等等。在这里,我简单介绍一下其中的一些关键点。
网络通信RPC 框架的核心是远程方法调用,因此必须实现网络通信来传递数据。可以采用 Java 的 Socket 编程来实现 TCP 方式的网络通信,并通过线程池或者 NIO 实现并发处理,也可以采用Tomcat、Netty等服务器的形式。这一块我们可以使用一个配置文件,实现程序的可扩展性。
序列化和反序列化在数据传输过程中,需要将对象进行序列化和反序列化。可以采用 Java 原生的序列化机制,也可以使用第三方的序列化框架,如 Json等,同样可以使用配置文件进行配置。
动态代理在客户端调用远程服务时,需要生成代理对象来实现远程方法 ...
背包问题
背包问题导语最近刷力扣每日一题的时候,又碰到了动态规划的题目,而且它这种题型是典型的背包问题。题目如下(力扣1262):
给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。
示例 1:
123输入:nums = [3,6,5,1,8]输出:18解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。
示例 2:
123输入:nums = [4]输出:0解释:4 不能被 3 整除,所以无法选出数字,返回 0。
示例 3:
123输入:nums = [1,2,3,4,4]输出:12解释:选出数字 1, 3, 4 以及 4,它们的和是 12(可被 3 整除的最大和)。
提示:
1 <= nums.length <= 4 * 10^4
1 <= nums[i] <= 10^4
为什么说它是背包问题呢?首先,它和01背包一样,都给定了一个限定条件,只不过01背包是容量限制,而这道题是余数限制。还有,都是从集合中进行选择,对于第i个元素,都有选和不选两种选择,最终的目的都是使得target最优。
本题最合适的方法便是动态规划, ...
统计回文子串的数量
题目描述题目来源:力扣 647
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
123输入:s = "abc"输出:3解释:三个回文子串: "a", "b", "c"
示例 2:
123输入:s = "aaa"输出:6解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
提示:
1 <= s.length <= 1000
s 由小写英文字母组成
方法如果一上来用暴力写的话,必定超时,时间复杂度为O($n^3$)。超时的原因很简单,因为对于每一个子串我们都进行了遍历,这样会造成很多的重复计算。因此,我们需要考虑利用 ...
LRU缓存的实现
LRU缓存的实现面试时有可能会被问到LRU的具体实现。在 Python 语言中,有一种结合了哈希表与双向链表的数据结构 OrderedDict,只需要短短的几行代码就可以完成本题。在 Java 语言中,同样有类似的数据结构 LinkedHashMap。但这些做法都不会符合面试官的要求,因此我们需要了解LRU底层的原理。
LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。
双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。
哈希表即为普通的哈希映射(HashMap),通过缓存数据的键映射到其在双向链表中的位置。
这样以来,我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1) 的时间内完成 get 或者 put 操作。具体的方法如下:
对于 get 操作,首先判断 key 是否存在:
如果 key 不存在,则返回 −1;
如果 key 存在,则 key 对应的节点是最近被使用的节点。通过哈希表定位到该节点在双 ...
讲几个业务相关的概念
讲几个业务相关的概念前言最近在中汽研实习,接触到了几个重要的概念,本贴分享一下。
ERP、OA、CRM、HR、BOM、MRPERP——企业资源管理ERP(Enterprise Resource Planning,企业资源规划)是一个综合的、集成的管理信息系统,它将企业中不同部门的业务流程整合起来,在一个统一的平台上管理企业的资源,如销售、采购、库存、财务等。我们实习做的MOM(Manufacturing Operations Management,制造运营管理)系统其实也算是ERP系统的一部分。
只要涉及到信息收集、分析、处理的行业,都可以使用。更适用于在几个方面需求较大的行业:
(1)企业需要降低库存,提高资金利用率和控制经营风险;
(2)控制产品生产成本,缩短产品生产周期;
(3)提高产品质量和合格率;
(4)减少财务坏帐、呆帐金额等。
OA——自动化办公OA 指的是 Office Automation,它是指通过计算机、网络和软件等信息技术手段,将传统的办公工作流程和业务过程进行自动化、集成和优化,提高办公效率和管理水平的一种方式。
办公自动化系统可以涵盖多个方面,包括但不限于以 ...