自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 redis系列六:压缩链表

何时使用压缩链表当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现。哈希键里面包含的所有键和值都是小整数值或者短字符串。...

2019-03-31 20:14:22 1034

原创 redis系列五:整数集合

整数集合(intset)是Redis用于保存整数值的集合抽象数据结构,它可以保存的类型为int16_t、int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素。整数集合定义在intset.h文件中,具体定义如下:typedef struct intset { uint32_t encoding; uint32_t length; int8_t cont...

2019-03-30 09:53:30 645

原创 [redis]redis系列四:跳跃表

跳跃表通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找。跳跃表的实现跳跃表定义在server.h文件中,下图所示为一个跳跃表的示例:上图中最左边的是zskiplist结构,右边四个是跳跃表节点(zskiplistNode结构),跳跃表的结构定义如下:// 跳跃表节点typedef struct zskip...

2019-03-28 20:20:30 398

原创 [redis] redis系列三:字典

redis中的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。数据结构哈希表节点结构哈希表节点结构定义如下:typedef struct dictEntry { // 键 void *key; // 值是一个union,即值可以是一个指针,或者一个unit64_t整数,或者int64_t整数 union ...

2019-03-26 23:45:15 218

原创 [redis] redis系列二:链表

redis中链表的数据结构定义如下:// 链表中的节点typedef struct listNode { // 节点的前驱 struct listNode *prev; // 节点的后继 struct listNode *next; // 节点上保存的值 void *value;} listNode;typedef struct listIter...

2019-03-26 21:50:47 210

原创 [redis] redis系列一:SDS字符串

注:本系列文章来自于对《redis设计与实现》的总结,并结合redis 5.0.3的源码进行分析redis没有直接使用C语言传统的字符串表示方式(以空字符串结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型,并将SDS作为redis的默认字符串表示。在redis里,包含字符串值的键值对在底层都是有SDS实...

2019-03-26 00:19:41 367

原创 [Linux] Linux IO模式及 select、poll、epoll详解

注:本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。本文讨论的背景是Linux环境下的network IO。一、概念说明用户空间和内核空间进程切换进程的阻塞文件描述符缓存 I/O用户空间...

2019-03-07 22:32:32 338

原创 [JUC] AQS共享模式详解

在[JUC] AQS独占模式详解中我们已经结合ReentrantLock分析了AQS独占模式的实现,本文将结合CountDownLatch分析共享模式的实现。场景说明如下图所示,有一个初始值为3的CountDownLatch,线程t1和t2在时间线1调用await等待latch的值变为0,线程t3在时间线2调用countDown()将latch值减1,线程t4在时间线3调用countDown(...

2019-02-15 14:50:53 703 1

原创 [JUC] AQS独占模式详解

前言AQS是指java.util.concurrent.locks.AbstractQueuedSynchronizer类,AQS并没有使用类似synchronized这样特殊的关键字,而是通过维护一个先进先出(FIFO)的等待队列和状态变量来实现锁和同步器功能。在JDK11中AbstractQueuedSynchronizer具有如下实现类:可以看到常用的ReentrantLock、Cou...

2019-02-13 14:45:15 1142 1

原创 [JUC] LockSupport浅析

这里写自定义目录标题wait/notifyLockSupportwait/notify和LockSupport对比LockSupport注意事项参考文献LockSupport是Java6引入的一个工具类,它简单灵活,应用广泛。在没有LockSupport之前,线程的挂起和唤醒咱们都是通过Object的wait和notify/notifyAll方法实现。我们以例子来说明两者之间的区别wait/...

2019-02-12 14:37:48 242

原创 [NIO与Netty] ThreadLocal详解

目录ThreadLocal的基本使用ThreadLocal实现原理ThreadLocal实现了Java中线程局部变量。所谓线程局部变量就是保存在每个线程中独有的一些数据,我们知道一个进程中的所有线程是共享该进程的资源的,线程对进程中的资源进行修改会反应到该进程中的其他线程上,如果我们希望一个线程对资源的修改不会影响到其他线程,那么就需要将该资源设为线程局部变量的形式。ThreadLocal的基...

2019-01-20 19:32:48 1106

原创 [mysql] ubuntu下如何干净的卸载mysql

dpkg --list|grep mysql查看mysql有哪些依赖:peter@ubuntu:~/Study/MySql/mysql-8.0.13-linux-glibc2.12-x86_64$ dpkg -- list|grep mysqlii mysql-client-core-5.7 5.7.24-0ubuntu0.18.04.1 ...

2019-01-02 22:54:25 947

原创 NIO和Netty系列(三): 堆外内存与零拷贝详解

在之前的文章中我们了解到NIO中堆外内存的实现类是java.nio.DirectByteBuffer和java.nio.MappedByteBuffer。本文中我们也通过这两个类来分析NIO中堆外内存的实现。如何从Java code获取堆外内存我们都知道Java code是运行在JVM进程所管理的内存上的,而堆外内存是JVM进程所管控的内存之外的,那么如何从Java代码中获取对外内存呢?在Ja...

2018-12-31 19:22:30 581

原创 [NIO和Netty] NIO和Netty系列(二): Java Reference详解

在分析DirectByteBuffer源码时发现使用到了java.lang.ref.Cleaner类,该类就是一个Reference,因此这里对Java中的Reference做个小结。Reference系列的类定义在java.lang.ref包下:...

2018-12-25 00:14:08 350

原创 [NIO和Netty] NIO和Netty系列(一): NIO中selector、channel和buffer

最近看zookeeper源码,发现底层的通信使用到了NIO和netty,接下来的系列记录下NIO和Netty的学习,记录完接着zookeeper源码的学习。NIO概述java.io中最为核心的概念是流(stream),是面向流的编程,一个流要么是输入流,要么是输出流,不可能同时即是输入流又是输出流;而java.nio是面向块(block)或面向缓冲区(buffer)编程,块或者缓冲区既可以作为...

2018-12-17 22:17:09 988

原创 [zookeeper]zookeeper系列八:zookeeper Leader选举源码分析

Zookeeper启动的main方法是org.apache.zookeeper.server.quorum.QuorumPeerMain类的main方法:public static void main(String[] args) { QuorumPeerMain main = new QuorumPeerMain(); try { mai...

2018-12-09 19:12:27 342

原创 [zookeeper]zookeeper系列七:zookeeper选举及数据一致性

ZAB协议ZAB(Zookeeper Atomic Broadcast)协议,即Zookeeper原子消息广播协议,协议内容大致如下:所有事物的请求必须由全局唯一的服务器来协调处理,这样的服务器被称为Leader服务器,而余下的其他服务器则称为Follower服务器,Leader服务器负责将一个客户端的事物请求转换成一个事物Proposal(提议),并将该Proposal分发给集群中的所有F...

2018-11-26 08:52:44 780 1

原创 [zookeeper]zookeeper系列六:zookeeper开源客户端curator

zookeeper原生api的不足zookeeper原生api存在以下不足之处:连接的创建是异步的,需要开发人员自行编码实现等待;连接没有自动的超时重连机制;Zk本身不提供序列化机制,需要开发人员自行指定,从而实现数据的序列化和反序列化;Watcher注册一次只会生效一次,需要不断的重复注册;Watcher本身的使用方式不符合java本身的术语,如果采用监听器的方式,更容易理解;不...

2018-11-24 22:52:45 1013

原创 [zookeeper]zookeeper系列五:zookeeper自带客户端原生api的使用

引入依赖zookeeper中自带一个客户端,只需要引入zookeeper,在build.gradle中添加以下依赖即可:compile ('org.apache.zookeeper:zookeeper:3.4.13')创建zookeeper会话org.apache.zookeeper.ZooKeeper类的构造方法用于创建zookeeper客户端与服务端之间的会话。该类提供了如下几个构造...

2018-09-18 00:51:57 1422

原创 [zookeeper]zookeeper系列四:分布式系统的理解

分布式系统集群的特点集群中所有节点维护的数据要一致所有节点都可以提供相同的业务功能(不一定是在同一时刻提供)集群需要保障系统的高可用,某个节点宕机不会影响服务集群环境下如何保障数据一致性集群环境下有两张方式可以保障数据一致性:数据复制和集中存储。数据复制:先向单节点写入,再复制到其他节点,zookeeper就是这样实现的;或者多节点同时写入,但只适合多节点写入的数据不是相同数据...

2018-09-18 00:25:37 949

原创 [zookeeper]zookeeper系列三:zookeeper中watcher的使用及原理

watcher解决的问题在进入watcher之前我们先试想在应用服务器集群中可能存在的两个问题:因为集群中有很多机器,当某个通用的配置发生变化后,怎么让自动的让所有服务器的配置统一生效?当集群中某个节点宕机,如何让集群中的其他节点知道?为了解决这两个问题,zookeeper引入了watcher机制来实现发布/订阅功能,能够让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态...

2018-09-15 10:49:31 13271 2

原创 [zookeeper] zookeeper系列二:zookeeper持久节点、临时节点及ACL

znode回顾我们回顾zookeeper中数据节点(znode)相关定义,然后进行实验验证。 znode相关定义如下:znode是zookeeper树形结构中的数据节点,用于存储数据;zookeeper中有两种类型的节点: 持久节点(PERSISENT):一旦创建,除非主动调用删除操作,否则一直存储在zk上;临时节点(EPHEMERAL):与客户端会话绑定,一旦客户端会话失效,这...

2018-09-14 22:48:36 14936 1

原创 [zookeeper] zookeeper系列一:zookeeper基本介绍

zppkeeper是什么zookeeper是一个高性能、开源的分布式应用协调服务,它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如实现同步(分布式锁)、配置管理、集群管理。它被设计为易于编程,使用文件系统目录树作为数据模型。服务端使用Java语言编写,并且提供了Java和C语言的客户端。 note:分布式的意味着由多台计算机构成的集群,每台计算机之间通过网络通信,这些...

2018-09-12 00:37:01 4235

原创 [thrift] thrift基本原理及使用

Thrift架构thrift主要用于各个服务之间的RPC通信,支持跨语言。thrift是一个典型的CS结构,客户端和服务端可以使用不同的语言开发,thrift通过IDL(Interface Description Language)来关联客户端和服务端。thrift的整体架构图如下图所示 如下图所示为thrift的网络栈结构 thirft使用socket进行数据传输,数据以特定的格...

2018-08-20 23:19:33 72662 7

原创 [JVM] class字节码文件结构分析

参考文档Chapter 4. The class File Formatclass字节码文件结构组成总体结构java源文件经java编译器编译后生成的class文件整体结构如下图所示: magic: 魔数,4个字节,为固定值0xCAFEBABE。jvm在加载class文件时,首先检查该class文件的前四个字节是否为0xCAFEBABE,若不是则jvm认为该文件不是java...

2018-08-12 14:07:19 612

原创 [操作系统] 操作系统真相还原读书笔记三:MBR加载loader到内存并跳转到loader执行

为什么要有loader程序?通过操作系统真相还原读书笔记二:编写MBR主引导记录我们已经能够正常运行MBR主引导记录(有些书籍也叫做boot)程序了,但该程序什么也没做。我们的MBR 受限于 512 宇节大小的,在那么小的空间中,设法为内核准备好环境,更没法将内核成功加载到内存井运行。 所以我们要在另一个程序中完成初始化环境及加载内核的任务,这个程序我们称之 为 loader,即加载器。那么l...

2018-08-04 14:54:40 474

原创 [操作系统] 操作系统真相还原读书笔记二:编写MBR主引导记录

BIOS实模式下1MB内存布局Intel 8086 有 20 条地址线,故其可以访问山西的内存空间,即 2 的 20 次方=1048576=1MB,地址范围若按16进制来表示是0x00000到0xFFFFF,该1MB内存布局如下图所示: 其中内存地址0x00000~x9FFFF 的空间范围是 640KB,这片地址对应到了 DRAM,也就是插在主板 上的内存条。顶部的0xF0000~0...

2018-08-04 00:19:31 492

原创 [操作系统] 操作系统真相还原读书笔记一:部署工作环境

该操作系统使用bochs开发,部署工作环境主要就是编译安装bochs。收集配置信息:peter@ubuntu:~/Study/Myos/chapter1/bochs-2.6$ ./configure --prefix=/home/peter/MySoft/bochs2.6/ --enable-debugger --enable-disasm --enable-iodebug --ena...

2018-08-03 21:34:39 861

转载 [Docker] Docker Dockerfile 定制镜像

本文为转载,原文地址Docker Dockerfile 定制镜像使用 Dockerfile 定制镜像镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile。Dockerfile是一个文本文件,其内包含...

2018-07-23 10:39:36 305

原创 [Kafka] Kafka(一):消息系统基本原理、Kafka初体验、Kafka基本架构

消息系统的分类基于Peer-to-Peer的消息系统一般基于pull或polling接受消息;发送到队列中的消息被一个而且仅仅一个接收者所接收,即使有多个接收者在同一个队列中侦听同一消息;即支持异步”即发即弃”的消息传送方式,也支持同步请求/应答传送方式;如下图所示,生产者Producer1生产的消息发送到队列后只能被其中某一个consumer所消费: 基于发布/订阅的消...

2018-07-06 00:04:03 608

原创 [算法] 排序算法总结

插入排序算法过程算法初始认为第一个元素是有序的,第二个元素及其后面的元素都是无序的,算法的过程就是将后面无序的元素依次插入到前面有序的元素中合适的位置的过程,期间可能需要移动前面部分有序的元素。代码实现private static void insert_sort(int[] array) { int length = array.length; ...

2018-06-30 21:48:02 184

原创 [Linux] Linux进程间通信(IPC)总结

在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方法。在linux下有多种进程间通信的方法:半双工管道、命名管道、消息队列、信号、信号量、共享内存、内存映射文件,套接字等等。使用这些机制可以为linux下的网络服务器开发提供灵活而又坚固的框架。...

2018-06-25 23:57:53 267

原创 [数据库] MySql知识点总结

MySQL架构总览MySQL的总体架构如下图所示 包括数据库连接器、连接池、SQL接口、解析器、优化器、缓存、存储引擎的等。其中常用的存储引擎为Innodb和MyISAM。Innodb有如下特点:使用Table Space的方式进行数据存储,表现为/var/lib/mysql/ibdata1文件和/var/lib/mysql/ib_logfile0文件;支持事...

2018-06-23 11:44:05 673

原创 [算法] 最长公共子序列

问题一个序列SSS任意删除若干个字符得到新序列TTT,则TTT叫做SSS的子序列;两个序列XXX和YYY的公共子序列中,长度最长的那个,定义为XXX和YYY的最长公共子序列(LCS,Longest Common Subsequence): 字符串134551345513455与245576245576245576的最长公共子序列为455455455字符串acdfgacdfgacdfg与...

2018-06-22 00:05:22 212

原创 [算法] 字符串循环左移

问题给定一个字符串S[0...N−1]S[0...N−1]S[0...N-1],要求把SSS的前kkk个字符串移动到SSS的尾部,如把字符串abcdefabcdefabcdef,前面的两个字符aaa、bbb移动到移动到字符串的尾部,得到新字符串cdefabcdefabcdefab:即字符串循环左移kkk个:循环左移n+kn+kn+k2和kkk2的效果相同;循环左移kkk位等价于循环右移...

2018-06-21 23:00:56 443

原创 [算法] 入栈出栈问题

问题给定无重复元素的两个等长数组,分别表述入栈序列和出栈序列,请问:这样的出栈序列是否可行: 例如:入栈序列为”ABCDEFG”、出栈序列为”BAEDFGC”,则可行;入栈序列为”ABCD”、出栈序列为”BDAC”,不可行;分析使用一个栈S来模拟压栈出栈的操作,栈顶元素即为s,记入栈序列为A,出栈序列为B,遍历B的每个元素b: 初始状态:栈s为空,认为栈顶元素与b相等,将A...

2018-06-20 00:18:34 3821

原创 [算法] 逆波兰表达式(栈实现)

问题计算给定的逆波兰表达式的值,有效操作只有+−∗/+−∗/+-*/,每个操作数都是整数;例如: ”2”, “1”, “+”, “3”, “*” : 9,(2+1)*3“4”, “13”, “5”, “/”, “+” : 6,4+(13/5)分析对于逆波兰表达式abc-d*;若当前字符是操作数,则压栈;若当前字符是操作符,则弹出栈中的两个操作数,计算后仍然压入栈中:...

2018-06-19 23:33:23 1111

原创 [算法] 括号匹配问题

问题给定字符串,仅由”()[]{}”六个字符组成,设计算法,判断该字符串是否有效。其中括号以正确的顺序配对称之为有效,如:”()”、”()[]”都是有效的,但”([)]”是无效的。...

2018-06-16 08:20:30 1343

原创 [算法] 最短路径条数问题

问题给定如图所示的无向连通图,假定图中所有边的权值均为1,显然,从源点A到终点T的最短路径有多条,求不同的最短路径数目。 分析权值相同的最短路径问题,则单源点DijkstraDijkstraDijkstra算法退化为BFS广度优先算法, 使用DijkstraDijkstraDijkstra算法只能求的到各个节点的最短路径,但不能求得最短路径的条数。假定起点为0,终点为N,数组step...

2018-06-15 23:57:54 4659

原创 [算法] 拓扑排序

定义对一个有向无环图(Directed Acyclic Graph,DAG)G进行拓扑排序,使得2任意一对定点uuu、vvv,若边(u,v)∈E(G)(u,v)∈E(G)(u,v) \in E(G),则在线性序列中uuu出现在vvv之前。如下图所示的DAG: 一种可能的拓扑排序是:2->8->0->3->7->1->5->6->9->...

2018-06-14 23:35:13 192

空空如也

空空如也

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

TA关注的人

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