自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(193)
  • 资源 (1)
  • 收藏
  • 关注

原创 【leveldb源码】核心结构之Block

深入理解Block下图是Block的图形化表示,从淡粉色到淡绿色是一个完整的k-v结构,各个色块代表什么在最下面进行了说明,注意的是Block中的key是有序存储的,每隔interval个k-v,就会有一个重启点(图中黑色边框的k-v),重启点的前缀不压缩。因为key是有序存储的,所以计算该key和前面一个key的公共最长前缀的长度,可以最大化的压缩key。因为Block的底层数据结构是Slice,Slice的底层数据结构是byte[],所以这里长度的统一单位是byte[]。说一些画图的题外

2020-11-07 14:58:21 305 2

原创 【Kick Start】ATM Queue

题目思路这题的思路是从前往后一次遍历,判断出每个人需要排队几次才可以取完钱。 按照排队的次数,有序按照index排列一开始想到用hashmap存储,key是排队次数,value是人员编号的list但是前一阵还总结了TreeMap是一种按照key有序存储的结构,所以这里用TreeMap,key是排队次数,value是人员编号的list队次数应该用(要取的钱 - 1) / 次可取的最大钱数,这里一定要减一,如果不减一的话,当要取的钱等于可取的最大钱数的时候,排队的次数就是1次了,其实应该是0次。最后

2020-09-27 16:02:21 158 2

原创 【leveldb源码】数据结构之Status

内部定义枚举类,对状态进行描述在源码中,对于状态函数的msg2都赋值了默认参数,如下所示。java中因为默认参数和方法重载同时出现的时候有二义性的问题,而且java本身就减少了很多特性,所以,我们此处通过重载来解决默认参数的问题。啊,翻译c++对我有难度,我的c++还给了老师,我对不起高老师,老师一定不希望我曝光他的名字,哭泣了 // Return error status of an appropriate type. static Status NotFound(const Slic.

2020-09-16 16:57:43 1499 4

原创 【leveldb源码】数据结构之Slice

leveldb的数据结构slice#ifndef STORAGE_LEVELDB_INCLUDE_SLICE_H_#define STORAGE_LEVELDB_INCLUDE_SLICE_H_

2020-09-14 18:14:53 488 1

原创 云平台中微服务前后端调用的方式

前后端分离架构下,前端调用后端的方式有以下两种:Ip+端口通过ip+端口的方式需要暴露后端服务,因为请求都是从浏览器发出的,需要让任意一个从浏览器发出的请求都可以访问。采用ip+端口方式的弊端:1. 需要将后端服务的ip加入dns,以免换了ip之后服务不可用2. 如果不分配域名的话,需要向外暴露ip,安全风险较高3. 可能被恶意访问造成服务崩溃,当然如果是内网的服务,一般隔了好几层防火墙,这个有点杞人忧天,网络安全先不考虑了,这个不太擅长。反向代理云平台中微服务的特点:后端作为云平台的

2020-05-25 13:51:30 2518

原创 【源码系列-4】【fastdfs系列-1】初始化客户端

fastdfs系列——初始化客户端事前声明解析配置文件、创建tracker group获取tracker事前声明本文使用的是100只(Mr / Miss)快乐鱼的开源代码,附上源码链接:https://github.com/happyfish100/从一个测试用例入手分析若想对fastdfs中的文件进行操作,分为下面几步:解析配置文件根据配置文件中的数据生成tracker serv...

2020-03-12 22:02:46 779

原创 【源码系列-2】PriorityQueue

PriorityQueue,我用过的场景是用来构建大小堆。PriorityQueue的排序是在创建时就制定的Comparable或Comparator。PriorityQueue不允许添加null元素。如果队列中插入Comparable或Comparator无法比较的元素时,会抛出ClassCastException异常。队列头是队列的最后一个元素。如果最后一个值有多个元素的话,队列头是任...

2020-02-19 16:26:41 171

原创 【源码系列-1】Serializable

序列化:序列化是指把对象转换为字节序列的过程,我们称之为对象的序列化,就是把内存中的这些对象变成一连串的字节(bytes)描述的过程。反序列化:就是把持久化的字节文件数据恢复为对象的过程。那么什么情况下需要序列化呢?大概有这样两类比较常见的场景:1)、需要把内存中的对象状态数据保存到一个文件或者数据库中的时候,这个场景是比较常见的,例如我们利用mybatis框架编写持久层insert...

2020-02-18 11:46:55 162

原创 map中的computeIfAbsent方法

computeIfAbsent

2017-09-08 15:12:51 8206

转载 【无标题】

dddddd

2022-05-26 19:07:30 137

原创 量化第一节学习

一、股指期货(沪深300股指期货)和交易所的一些知识:股指期货没有夜盘 高频分析数据量大,可以并行的,尽量并行,所以程序核数尽量大 期货合约会到期,股票不会 量化交易更关注变化量,但是交易所只发布累积量 turnover :成交额 冲击成本:就是交易的资金量较市场总量较大而造成不能按照预期价格全部成交而多支付的成本。比如我是一个机构,看中某一只股票,其日均成交量为2亿,现在我想建仓买入1亿元,假如现价20元,涨幅0.00%,如果这1亿我一次性买入的话这股肯定一下就被推到涨停了,本来我预想是以2

2021-02-09 20:07:53 442

原创 controller中获取用户信息的方式

目录1. 利用session获取(不优雅)2. 定义AOP3. 拦截器+方法参数解析器大多数controller中都需要获得用户信息,根据用户做一些操作1. 利用session获取(不优雅)每个controller之前首先通过tokenUtils.getUserByToken(token)获取User。2. 定义AOP使用AOP的方法,在进入controller之前,将user赋值到参数中@Aspect@Componentpublic class UserIdAdvice {

2021-01-02 18:08:25 4323 2

原创 InitializingBean的使用方法、原理及实例增加时的同步问题

目录标题1、InitializingBean的使用方法2、InitializingBean的原理3、实例增加时的同步问题1、InitializingBean的使用方法InitializingBean接口定义了bean初始化的方式,它只包括afterPropertiesSet方法,如果一个类实现了InitializingBean 接口,则可以在初始化类的时候进行一些工作。下面的代码在初始化ActivityController的时候完成了写入redis的工作。public class ActivityCo

2020-12-31 17:00:53 578

原创 springboot延迟加载

懒加载或者延迟加载是指spring容器启动的时候先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中。优点:缩短启动时间缺点:如果发生配置错误,则在系统启动的时候发现不了,需要严格测试,且需要保证JVM的堆空间可以满足所有的bean懒加载又分为全局懒加载和局部懒加载,全局时通过配置实现,局部时通过在类上增加@Lazy注解实现...

2020-12-31 16:59:35 1675 1

原创 【leveldb源码】“读”流程及实现

文章目录step0. 加互斥锁,ReentrantLockstep1. 写logstep2. 更新memtablestep3. 根据option中的选项决定是否产生快照step4. 释放锁step0. 加互斥锁,ReentrantLockstep1. 写log实现批量写操作的接口如下,因为一条log的格式如上,因此在put方法里,除了k-v的长度,还需要3个int (type+key length+value length),也就是12位byte的长度,delete因为不需要添加value信息,因此

2020-11-29 22:21:58 302

原创 【leveldb源码】“写”流程及实现

文章目录step0. 加锁,ReentrantLockstep1. 写logstep2. 更新memtablestep3. 根据option中的选项决定是否产生快照step4. 释放锁step0. 加锁,ReentrantLockstep1. 写log实现批量写操作的接口如下,因为一条log的格式如上,因此在put方法里,除了k-v的长度,还需要3个int (type+key length+value length),也就是12位byte的长度,delete因为不需要添加value信息,因此需要k的

2020-11-29 21:35:31 296

原创 【源码系列】LinkedBlockingQueue源码分析

目录亮点数据结构入队方法1. put(E e)2. offer(E e)出队方法1. E take()2. E poll()LOCK的原理及使用已经在本文中进行了描述,感兴趣的同志请移步。在实现一个简单的ORM框架的时候,使用LinkedBlockingQueue来实现连接池的功能,这里分析下LinkedBlockingQueue的原理,以便记忆,顺便传播,哈哈哈亮点LinkedBlockingQueue实现的队列中的锁是分离的,其添加采用的是putLock,移除采用的则是takeLock,

2020-11-29 14:37:56 134

原创 【源码系列】Lock和AQS

在分析LinkedBlockingQueue源码的时候,里面用到了ReentrantLock,所以本篇我们分析下ReentrantLock的原理。目录一、Lock方法介绍二、实现Lock的类介绍(ReentrantLock、ReentrantReadWriteLock)1. ReentrantLock使用举例2. AbstractQueuedSynchronizer原理分析a). AbstractQueuedSynchronizer实现独占锁和共享锁b). 内部维护的是一个FIFO的双向链表3. Re.

2020-11-29 14:20:19 243

原创 【MyBatis源码-1】JDBC

Connection是JDBC对数据连接的抽象,可以通过 DriverManager和DataSource获得Connection对象。Statement接口可以理解为JDBC API中提供的SQL语句执行器,定义了执行SQL语句的方法。通过Statement接口提供的getResultset()来获取查询结果集、通过getUpdateCount()获取更新操作影响的行数。PooledConnection表示与数据库建立的物理连接,当应用程序调用DataSource的getConnection()时.

2020-11-29 00:53:06 160

原创 ArrayListMultimap源码

总算明白了美悦苦心积虑让我看guava的良苦用心,真是太香了啊!!综述我们都知道,ArrayListMultimap的key允许重复,value可以append,类似于下面这样private final Multimap<Integer, String> newFiles = ArrayListMultimap.create();newFiles.put(1, "science");newFiles.put(1, "nature");newFiles.put(1, "nature.

2020-11-28 00:26:46 193 1

原创 MapMaker原理

今天做项目,碰到了使用MapMaker的场景,最近用了好多guava的东西,好多都是用作缓存的,真香啊!MapMaker其实是ConcurrentMap的实例,不过他还合并了很多特性,主要的特性有:key和value被自动包装成软引用或弱引用可以创建监听,可以在Entry被移除或者删除之前,对Entry做一些处理用来构造ConcurrentHashMap:得到线程安全的hashMap@Override public <K, V> ConcurrentMap<K.

2020-11-27 22:39:57 1408 1

原创 Lists.transform的使用

已知有一个类描述了文件信息public class FileMetaData{ private final long number; private final long fileSize; private final InternalKey smallest; private final InternalKey largest; public InternalKey getLargest() { return largest;

2020-11-27 18:07:14 382

原创 【面试】要读的数据太大,超出内存怎么办

当你too young 头naive,如今有了解决方案方案一、内存共享文件MappedByteBuffer创建文件获得MappedByteBuffer这样操作文件数据就像操作内存数据一样简单附:原理和使用方法方案二、随机流RandomAccessFile随机流(RandomAccessFile)不属于IO流,支持对文件的读取和写入随机访问。把随机访问的文件对象看作存储在文件系统中的一个大型 byte 数组后通过指向该 byte 数组的光标或索引(即:文件指针 FilePointer)在.

2020-11-26 23:01:23 557

原创 java复制、删除文件,创建文件夹

public final class FileUtils{ private static final int TEMP_DIR_ATTEMPTS = 10000; private FileUtils() { } // 判断文件是否问软链接,软连接的定义:https://www.runoob.com/linux/linux-comm-ln.html // linux中的软链接类似于windows中的快捷方式,一个形象的例子:https://blog.cs.

2020-11-26 21:16:22 194

原创 LoadingCache

LoadingCache的目录创建LoadingCacheget方法removalListener方法一直没怎么用过guava的缓存,今天终于有机会尝试,非常欣喜,开篇废话略多,这是个吉祥的开始前面还写过两篇缓存的文章 本地缓存、缓存那些事儿,可惜那时对缓存的理解没有如今深刻LoadingCache 是guava cache的一个接口,是缓存的本地实现,通过建造者模式实现。创建LoadingCacheLoadingCache<Key, Graph> graphs = CacheBu

2020-11-26 16:26:37 1097

原创 Java虚引用

虚引用虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样。用 PhantomReference 类来表示,通过查看这个类的源码,发现它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,也就是说将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用。源码:public class PhantomReference<T> extends Reference<T> {

2020-11-26 16:11:02 259

原创 【leveldb源码】核心功能之LogReader

LogReader用于从文件中读出一个完整的log,并返回其中的data内容。一、一个log record的格式如下:| crc32 | length | log type | data |其中,crc32占4 byte,length占2byte,type占1byte,这三个作为log头,共占据7byte二、log record在文件中存储的格式如下:log在文件中的存储格式如下,我们从文件读的时候是一个block,一个block读出来的。可能多个log record构成了一个完整的log。

2020-11-25 15:49:54 583

原创 MappedByteBuffer释放内存

FileChannel在调用了map方法,进行内存映射得到MappedByteBuffer,但是没有提供unmap方法(),释放内存。可以利用工具类来释放MappedByteBuffer。ByteBufferSupport.unmap(mappedByteBuffer);mappedByteBuffer = null;

2020-11-24 23:15:55 799

原创 MappedByteBuffer原理->实现内存映射文件,像访问内存中的数组一样访问文件

虚拟内存每一个运行的进程,都会获得一个 4G的内存地址空间,这就是所谓的虚拟内存,这里面的所有地址都是虚拟的,和物理内存啥的并不直接挂钩。而在操作系统那头,这些虚拟地址所映射到的实际地址,可以是物理内存地址,也可以是页面文件的地址。如果是物理内存小于这个虚拟地址的范围的话,映射的物理内存还可能是重复的物理内存地址片段,使用的时 候可以通过清空内存数据,将内存数据写入页面文件这样的方式进行物理内存的重新利用,以提高物理内存的利用效率。I/O调用的基本原理直接通过API做IO,会用到一系列的系统调用(sy

2020-11-24 22:18:55 789

原创 【leveldb源码】LogType

LogType作为log record的一部分,用于说明log record是完整的在一个block当中,还是分开在不同的block中。LogType有4种可取的值:FULL = 1、FIRST = 2、MIDDLE = 3、LAST = 4。FULL,说明该log record包含一个完整的user recordFIRST,说明是user record的第一条log recordMIDDLE,说明是user record中间的log recordLAST,说明是user record最后的一条

2020-11-24 20:17:32 449

原创 AtomicInteger源码

题外话,在leveldb的实现中遇到了AtomicInteger,这里我们来好好学习下他的源码同步和互斥首先明确多线程的同步和互斥的概念:同步指在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。如果用对资源的访问来定义的话,同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。互斥.

2020-11-23 17:51:34 138

原创 volatile关键字

目录JVM原则的先行发生原则(Happen-Before)自带的先行发生原则:一、程序次序原则二、管程锁定规则三、volatile 变量规则四、线程启动规则五、线程终止规则六、线程中断规则七、对象终结规则八、传递性volatile禁止指令重排JVM原则的先行发生原则(Happen-Before)先行发生原则是 Java 内存模型中定义的两个操作之间的偏序关系。比如说操作 A 先行发生于操作 B,那么在 B 操作发生之前,A 操作产生的“影响”都会被操作 B 感知到。这里的影响是指修改了内存中的共享变量、

2020-11-23 17:06:47 168

原创 【leveldb源码】核心结构之SequenceNumber

SequenceNumbers是所有基于op log系统的关键数据,它唯一指定了不同操作的时间顺序,该类实现了利用7 byte的SequenceNumbers和1byte的valuetype构建完整的long,也实现了从long中拆出SequenceNumbers和valuetype的功能public final class SequenceNumber{ // SequenceNumber是Key的一部分,占 7 byte,ValueType占1byte,组合之后就是long // (

2020-11-23 15:09:41 643

原创 【leveldb源码】核心结构之InternalKey

InternalKey介绍InternalKey是由User key + SequenceNumber + ValueType组合而成的InternalKey的格式为:| User key (string) | sequence number (7 bytes) | value type (1 byte) |sequence number大小是7 bytes,sequence number是所有基于op log系统的关键数据,它唯一指定了不同操作的时间顺序。把user key放到前面的原因是,这

2020-11-23 14:54:28 462

转载 一篇非常好的写正则的帖子

https://www.cnblogs.com/chengwaiting/p/3612243.html?utm_source=tuicool&utm_medium=referral

2020-11-21 16:50:41 71

原创 ArrayDeque原理

Deque 接口继承自 Queue接口,Queue 也是 Java 集合框架中定义的一种接口,直接继承自 Collection 接口。Deque 支持同时从两端添加或移除元素,因此又被成为双端队列。Deque 和 Queue 方法的的对应关系如下:Queue MethodDeque Methodadd(e)addLast(e)offer(e)offerLast(e)remove()removeFirst()poll()pollFirst()elemen

2020-11-18 21:12:51 207

原创 【操作系统】进程

2020-11-09 13:03:27 61

原创 北新建材的逻辑

白酒涨得快,导致买的少,所以赚的少谦和屋关注的:龚志厚北新收购了三家小公司,开始做防水,三家共20亿营收,雨虹一年200亿营收关注灰色钻石谦和屋的北新建材已经赚了30%多了,是投资峰会上前辈和他交流后他研究了决定买入的宋志平先生的“三盘牛肉”理论,是个平和坚韧的人,可以找找宋志平的采访和节目,他还出了本书北新建材、中国国药、中国建材是宋志平的三家公司,虽然已经不是北新建材的董事长了,但是留下了企业文化,几年不会消散三盘牛头:在整合水泥市场的时候创建的,当时水泥厂拼命杀价,最后都亏钱,宋志平在.

2020-11-07 16:16:52 279

原创 【leveldb源码】核心结构之BlockIterator

直接上代码,解释及逻辑都在注释里在 public void seek(Slice targetKey)函数中有一块非常精华的部分,因为有重启点的位置信息,且存储点是有序的,可以二分查找重启点,直到找到小于targetKey的最大key,在该重启点及后面的压缩key区域线性查找对应的key。源码这个二分思想太漂亮了!!int left = 0; int right = restartCount - 1; // 二分查找重启点和targetKey,直到找到大于targetke

2020-11-07 15:42:43 127

原创 【leveldb源码】核心结构之BlockBuilder

BlockBuilder创建的核心步骤和代码回顾Block的结构成员变量成员函数构造函数重设内容,通常在Finish之后调用,来构建新的block返回正在构建block的未压缩大小(估计值)添加key-value计算公共前缀长度结束构建block,并返回指向block内容的指针BlockBuilder是用于创建Block的。回顾Block的结构block分为k/v存储区和后面的重启点存储区两部分,对于一个k/v对,其在block中的存储格式为:共享前缀长度 shared_bytes

2020-11-04 20:02:56 515

电子万年历

北邮小学期,大二末数电小学期,最终完整版,仿真,连线都可以过

2013-09-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除