天上星河转,人间帘幕垂。
分布式事务原理要谈分布式事务,我们就要首先来谈一下本地事务。事务本地事务主要要满足四个特性:ACID 。Atomic: 原子性Consistency: 一致性Isolation: 隔离性Duration: 持久性其他几个性质都还比较好理解,主要是我们来讲一下我们有关与隔离性,MySQL是允许多个事务并发操作相同的数据,都有自己的完整数据空间。各个事务之间的操作是隔离的。并发执行的各个事务之间互不干扰。以上四种本地事务可以见 小林Coding 中MySQL对于几种特性的保证实现原理。我觉得算是设计的比较妙的。既然说到了的话,我们还是提一下吧。在 MySQL 中,:持久性由 redo log重做日志保证原子性是undo log 回滚日志保证隔离性是由MVCC多版本并发控制保证的。MySQL 事务隔离级别隔离级别脏读不可重复读幻读读未提交PossiblePossiblePossible读已提交ImpossiblePossiblePossible可重复读ImpossibleImpossiblePossible串行化ImpossibleImpossibleImpossible其中MySQL 默认
0x01 前言!有很多话是在半夜和酒后写的,浅看当个乐子吧。想写这篇文章的想法萌生于8月份,只是觉得要对于这二十年做一个小小的总结吧。二十年说长还是挺长的,但是感觉自己二十年来做出来的成绩是比较小的。因此这也并不是一篇夸耀自己的文章,只是从现在出发对于在以前一些的事情的看法。我不是一个擅长记录的人,因此我所能找到的记录其实是比较少的。当然也只能从这里面的记录里讲讲了。但是从高中到大学这段时间里记录的东西是变多了,记录的对象有我自己也有我的朋友。说想写但是一直不知道该怎么区分我想说的东西呢,索性就按照过去、现在、将来来划分吧。0x02 过去我始终觉得小学到中学时期里,最开心的一段时间是在初中在安徽那边读书的时候。那段时间里跟大家相处比较好,大家也没有什么小心思之类的就聚在一起玩。很可惜之后也因为在初二时候转回四川所以联系也就越来越少了。当然这也是很正常的,因为毕竟不在同一个环境里了,大家聊的东西也不是同一个了。对于转回来的中学这段时间我没什么好说的。有些人让我感到厌烦可以说到了讨厌的地步。当然还是有早恋的情况的,也是在初三末期了。后面断断续续也到了高中毕业,也就随之断了。这里面有太多事情
整数集合部分Redis 整数集合(intset), 我通篇读下来之后最大感受其实对于存放数据的操作。Redis 整数集合的本质其实也是一个数组,只不过里面存放的数据是按照顺序存放的,并且不会重复。typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[]; } intset;老生常谈的问题是 int8_t 虽然是作为保存元素的数组存在。但是实际上是由encoding的值决定的。主要有下面三个选项:INTSET_ENC_INT16INTSET_ENC_INT32INTSET_ENC_INT64当一个数据是一个16位的整数类型的时候,其实我们就可以用两个字节的空间去表示一个元素。例如一个INTSET_ENC_INT16 可以用两个 int8_t来表示,同理32、64也是以这种方式表示的。升级Redis 整数集合比较优秀的一个功能的。比方说我们目前存的数据都是int8类型的整数(
离职前的团建面试与匆忙的准备在七月半的时候,有幸得到了一次面试的机会。面试我的人就是我后面的老大——变哥。变哥是电子科大的本硕,我对于变哥的学校光环还是很大的,当然这也是我后面吹水才知道的。面试时变哥给我的第一印象是一个比较斯文的理工科男生,为什么说男生呢。虽然变哥已经结婚了,但是感觉看着还是十分年轻的。变哥没有问我很多的八股问题,或者说干脆没有怎么涉猎八股,基本上是从我简历上的项目出发的。我简历上所写的项目,是我自己构思、实现再到微服务改造的,因此对于技术的细节上来说我还是比较熟悉的。可能也正是因为项目上整体回答的还不错,所以进展还是比较顺利的。从周一面试完,周二拿到了HR发来的Offer。整个流程是走的比较快的。只能说这次实习纯粹是意料之外的经历,算得上是无心插柳柳成荫了。因为答应了HR当周报道,因此我也只花了两天的时间去找房子搬东西。租房的时间实际上过于紧凑了,因此踩了不少坑。首先就是被一个傻逼骗到了一个地方,但是房源信息是假的,中介说经常有人散播虚假的房源信息然后欺骗找找房者前来增加热度。当天的雨下的很大,从地铁站出来之后也被淋湿了不少。早上没有吃任何东西,在旁边的便利店匆忙吃
前言Redis 在跳表中主要应用在 ZSET 中,通常的Zset中的score 就是作为节点排序的依据。说起跳表可能还是比较陌生,我们会先从SkipList 是什么讲起。跳表首先,SkipList 本质是对一个有序数组建立的多层索引的结构。这个数据结构基本上没有在专业相关的教科书中提及过。 因此还是比较新的一种数据结构。普通的一个链表,如果我们要查找一个其中的一个元素的话。需要遍历整个的链表,因此时间复杂度为 O(n), 如果说是有序的数组的话就我们可以用有二分算法,实现O(logN). 这也是为什么调表有时候会被拿来与二分比较。这两者的区别就是,链表不支持随机读,数组可以通过下标直接定位读取数据。说起来有点抽象,但是我们先看图就好了。 图片来自于https://www.jianshu.com/p/9d8296562806 如果我们此时定位 元素5 的话, 我们先从第二级索引出发,发现 1 < 5 < 7, 因此我们要从第二级索引中的 1节点下来到第一级索引。 发现 4 < 5 < 7。 重复上面这一个动作找的了5.因此,这是一种常见的用空间换时间的算法逻辑,
前言与闲聊Redis 是一个 Key-Value 的非关系形态的数据库。字典,就是Redis中保存键值对的抽象数据结构。Key应当是独一无二的。redis> HGETALL website 1)"Redis" 2)"Redis.io" 3)"MariaDB" 4)"MariaDB.org" 5)"MongoDB" 6)"MongoDB.org" # ...上面的website键就包含了很多键值对, Redis->Redis.io . Redis 在不少地方都使用了字典并且选择了自己去实现了字典,那么下面就让我们详细的来看一下实现的技术细节吧。实现细节哈希表哈希表用起来是非常舒适的,就像HashMap一样。这种结构可以很好的,存储一些对象类型的数据.例如我们可以把一个多层级的不定的JSON数据给转换成Map<\String, Object>. 能够更方便我们去动态解析我们所需要的数据。而不用去新建一个Class, 然后去接受对象。在Redis实现
Collection 内的亲密关系老九献给威虎山的先遣图:上面列举了详细的 Java 集合类框架。其中主要是两部分分别位于 java.util 和 java.util.concurrent 包中的。从名字上就可以看到区分的点了:java.util.concurrent: 可以保证在并发情况下的对于集合内的修改的安全性。java.util: 不一定能保证线程安全性。并不意味着所有的java.util 下的集合都不能保证线程安全。其中就有我们今天主要要讲的 Vector 、HashTable 。Vector你只要学习过一段时间或者写过一段时间C++(写算法题). 就肯定知道有个东西也叫 vector.这两个在用法上非常相似,但是我们现在不是聊用法的时候。我们是要深入底层去学习。组成部分——我来组成头!/** * The array buffer into which the components of the vector are * stored. The capacity of the vector is the length of this array buff
先上提交的答案/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func reverseKGroup(head *ListNode, k int) *ListNode { var tmp,res *ListNode = head,head if k <= 1 { return head } var cap []*ListNode = make([]*ListNode, k+2) LOOP: for tmp != nil { for i:=1; i <= k;i++{ cap[i] = tmp; if tmp.Next != nil || i == k { tmp = tmp.Next }else{
类加载机制类加载的时机一个类整个生命周期会有7个阶段:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution) 、初始化(Initialization)、使用(Using)、卸载(unloading) 这几个阶段中,加载、验证、解析、初始化、卸载这几个阶段顺序是确定的。类的加载过程都是按照这个顺序开始的, 不是运行、结束,因为这几个过程是会相互交叉混合进行。而解析阶段有可能会在初始化阶段之后再次开始——支持运行时绑定(动态绑定)的特性。JVM规范并没有对加载什么时候做规定,但是对于初始化严格规定必须在遇到六种情况下马上执行。下面初始化阶段前置条件都是还没初始化过。遇到new、getstatic、putstatic、invokestatic这四个指令码时,若没有初始化过就会触发初始化阶段。new关键字创建对象读取设置一个静态字段调用一个静态方法java.lang.reflect 包对类型进行反射调用的时候初始化类发现父类没有初始化过虚拟机启动用户指定执行的主类JDK7 java.lang.MethodHandle 实例最后解析
Class 类文件结构一、前言一个优秀的程序或系统一般具有良好的兼容性。比如 Windows11 目前仍然可以运行Windows7 时代的程序。而我们的JVM也有很好的向后兼容性,这也得益于我们的Class 文件结构的稳定。不同版本的《Java虚拟机规范》对Class文件格式添加,但未更改已经存在的内容。二、 深入Class文件结构根据《Java虚拟机规范》的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:“无符号数”和“表”。无符号数一般是以 u1、u2、u4、u8表示 一个字节的、两个字节、四字节、8字节的无符号数。表:由多个无符号数或其他表作为数据项构成的复合数据类型。所有表命名习惯以 \_info 结尾, 整个Class文件可以看做一张大的表那我们的Class表长什么样子呢?如下图[!NOTE]在我们不清楚一个数据项有多少个时,我们通常留有一个数字表示他的个数。Class各个数据项之间没有分隔符,因此所有数据的顺序数量都是被严格限定的,才可以被我们有效的读入。MagicNumber 与 版本号魔数(MagicNumber)是一
RE1IFE
一个淹死在时代浪潮中的Coder