天上星河转,人间帘幕垂。
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类型的整数(
前言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)是一
Version3 过滤器、优化与SpringStarter开发SPISPI 机制是JDK提供的一个本地服务注册与加载的机制.这么讲可能有点抽象,首先,一个接口可能会有多个实现类。如果按照一般的方式,我们可能会在程序运行的时候,根据某些条件来判断使用哪一个实现类。但是,这样有一个缺点就是不方便我们后续拓展。而SPI 多用于框架扩展、插件开发等等。如何使用SPI首先需要有个 interfacepublic interface test{ public void hello(); }然后我们实现一些这个类//StudentA.java public class StudentA implements test{ @Override public void hello(){ sout("I'm a good boy!"); } } //StudentB.java public class StudentB implements test{ @Override public void hello(){
Version2 对于Nacos的引入以及Router设计Nacos 服务注册中心由于本 Vekt RPC 目前是主要针对于Nacos的一款RPC, 因此首先引入 NacosClient.Nacos 可以分为 ConfigService 和 NamingService ,主要就是配置中心与服务注册中心。我们主要是会用到NamingService.<dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.2.4</version> </dependency>我们先来看一下我们项目的图:RegistryService 作为注册服务接口,给出了注册、反注册、订阅、取消订阅的方法,而后被 AbstractRegister 默认实现,大部分参数是URL,也就是我们的Instance 的一些信息。将其在Cache中移动。同时
RE1IFE
一个淹死在时代浪潮中的Coder