自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis Sentinel

一、概述二、启动并初始化Sentinel

2019-07-12 00:04:00 281

原创 Java N个线程轮流打印数字

这里实现两个线程轮流打印1-100数字,即线程一打印1,3,5,…,线程二打印2,4,6,…。class PrintThread implements Runnable { private byte[] flag; int number; public PrintThread(int number, byte[] flag) { this.number = number; ...

2019-07-11 11:12:37 1391

原创 Redis 复制

一、复制【198 在Redis中,用户—的服务器则被称为从服务器】1.1 旧版复制功能的实现(Redis 2.8 以前)【199 Redis的复制功能分为—结尾】【200 开头–图15-2】命令传播:主服务器会将自己执行的写命令,也即是造成主从服务器不一致的那条写命令,发送给从服务器执行,让两者再次回到一致状态。1.2 旧版复制功能的缺陷【201 在Redis中,从服务器对主服务器...

2019-07-10 19:09:15 254

原创 notify() 和 signal() 唤醒线程是随机的吗?

一、概述synchronized 是非公平锁。ReentrantLock 默认是非公平锁,但可设置为公平锁。那线程通过Object.nofity() 和 Condition.signal() 被唤醒时是否是公平的呢?先说结果,在Java 1.8 HotSpot下,两者都是公平的。查看Java文档:void signal()Wakes up one waiting thread.If...

2019-07-09 20:28:24 4569 16

原创 Redis 客户端与服务器

一、客户端对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redis.h/redisClient结构(客户端状态)。这个结构保存了客户端当前的状态信息,以及执行相关功能时需要用到的数据结构,其中包括:客户端的套接字描述符客户端的名字客户端的标志值指向客户端正在使用的数据库的指针,以及该数据库的号码客户端当前要执行的命令、命令的参数、命令参数的个数,以及指向命令实现函...

2019-07-04 23:04:57 370

原创 Java String 类解析

String对象是不可变的String 被声明为 final,因此它不可被继承。内部使用 char 数组存储数据,该数组被声明为 private final char value[];,这意味着 value 数组初始化之后就不能再引用其它数组。并且 String 内部没有改变 value 数组的方法,因此可以保证 String 不可变。String类中每一个看起来会修改String值的方法实际...

2019-07-04 22:49:38 325

原创 Java 反射

Class 对象如果想在运行时使用类型信息,就必须首先获得对恰当的Class对象的引用。Class.forName()就是实现此功能的捷径,因为这样就不需要为了获得Class引用而持有该类型的对象。但如果已经拥有一个感兴趣的类型的对象,那就可以使用getClass()方法来获取Class引用。这个方法属于Object类的一部分,它将返回该对象实际类型的Class引用。拥有Class对象可以使用...

2019-07-03 23:45:04 1611

原创 MySQL 复制

复制的工作原理复制是MySQL数据库提供的一种高可用高性能的解决方案,一般用来建立大型的应用。总体来说,replication的工作原理分为以下3个步骤:主服务器(master)把数据更改记录到二进制日志(binlog)中。从服务器(slave)把主服务器的二进制日志复制到自己的中继日志(relay log)中。从服务器重做中继日志中的日志,把更改应用到自己的数据库上,以达到数据的最终一...

2019-07-02 00:31:10 169

原创 MySQL 扩展

一、概述MySQL 水平拓展的策略分为三个部分:复制拆分数据分片(sharding)二、复制最简单也最常见的向外扩展的方法是通过复制将数据分发到多个服务器上,然后将备库用于读查询。这种技术对于以读为主的应用很有效,它也有一些缺点,例如重复缓存等等。三、按功能拆分按功能拆分,每个节点只包含特定应用所需要的数据,各个部分无须共享数据,可以按功能区域进行划分。如果有数据交叉的需求,也...

2019-07-02 00:19:11 331

原创 MySQL 数据库的文件

2019-06-27 23:09:02 368

原创 InnoDB 存储引擎的整体设计

一、概述InnoDB 是事务安全的MySQL存储引擎,其特点是行锁设计、支持MVVC、支持外键、提供一致性非锁定读。二、InnoDB 体系架构2.1 后台线程InnoDB 存储引擎是多线程的模型,后台有多个不同的线程负责处理不同的任务。2.1.1 Master ThreadMaster Thread 是一个非常核心的后台线程,负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏...

2019-06-26 23:22:54 219

原创 LeetCode Database 题目

175.SELECT Person.FirstName, Person.LastName, Address.City, Address.StateFROM Person LEFT JOIN AddressON Person.PersonId = Address.PersonId;176.SELECT MAX(Salary) AS SecondHighestSalaryFROM Emp...

2019-06-20 10:40:44 226

原创 Java 注解

概述注解的优点包括:更加干净易读的代码,以及编译期类型检查。注解的语法比较简单,除了@符号的使用之外,它基本与Java固有的语法一致。Java内置了三种注解,定义在java.lang中的注解:@Override,表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。@Deprecated,如果程序员使用了注解为它的元素,那么编...

2019-06-18 11:46:16 198

原创 操作系统之进程管理

一、进程与线程1. 进程进程是资源分配的基本单位。进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。2. 线程线程是独立调度的基本单位。一个进程中可以有多个线程,它们共享进程资源。QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等...

2019-05-21 20:48:23 294

原创 fork和vfork的区别

概述fork和vfork都是用来创建一个子进程的。

2019-05-19 16:09:28 3506 1

原创 InnoDB 存储引擎的索引

一、InnoDB 索引分类索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。如果索引太多,应用程序的性能可能会受到影响。而索引太少,也会对查询性能产生影响。InnoDB 支持三种索引:B+树索引、哈希索引、全文索引。一般机械硬盘每秒至少可以做100次IO,每次约需要0.01秒。可以使用EXPLAIN分析SQL语句的执行情况。B树和B+树的对比...

2019-05-11 12:10:07 476

原创 Redis AOF 持久化

BGREWRITEAOF 命令用于异步执行一个 AOF 文件重写操作。重写会创建一个当前 AOF 文件的体积优化版本。即使 BGREWRITEAOF 执行失败,也不会有任何数据丢失,因为旧的 AOF 文件在 Bgrewriteaof 成功之前不会被修改。...

2019-04-29 16:03:10 138

原创 Redis RDB 持久化

RDB 持久化 (AppendOnly File)Redis 是内存数据库,如果不把内存中的数据库状态(所有非空数据库及其键值对)储存到硬盘中,当数据库进程退出,数据会消失。RDB 文件的创建与载入BGREWRITEAOF 命令用于异步执行一个 AOF 文件重写操作。重写会创建一个当前 AOF 文件的体积优化版本。即使 BGREWRITEAOF 执行失败,也不会有任何数据丢失,因为旧的...

2019-04-28 21:31:47 184

原创 Java 线程池

3.1 Executor 接口java.util.concurrent 包中的执行器(Executor) 接口可以管理 Thread 对象,从而简化并发编程。Executor 允许你管理异步任务的执行,而无需显式地管理线程的生命周期。ExecutorService 接口继承自Executor(具有服务生命周期的Executor,例如关闭) 知道如何构建恰当的上下文来执行Runnable对象。...

2019-04-28 00:45:19 249

原创 Redis 事件

一、Redis 事件二、文件事件文件事件处理器以单线程运行。IO多路复用(IO Multiplexing):即经典的Reactor设计模式,Java中的Selector和Linux中的epoll都是这种模型。1. 文件事件处理器2. IO 多路复用程序的实现三、时间事件serverCron 也会调用定期删除过期键的函数。四、事件的调度与执行五、重点...

2019-04-21 21:15:06 251

原创 Redis 数据库及过期键的实现

一、服务器中的数据库二、键的过期Redis 可以设置键的生存时间或过期时间。RedisDB 结构中的expires字典保存了数据库中所有键的过期时间,称这个字典为过期字典。2.1 Redis 的过期键删除策略Redis 服务器实际使用惰性删除和定期删除两种策略。通过配合两种删除策略,可以在CPU时间和避免浪费内存空间之间取得平衡。2.2 惰性删除策略的实现2...

2019-04-21 19:04:33 300

原创 操作系统之内存管理

一、虚拟内存虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失...

2019-04-21 12:07:58 294

原创 MySQL 中常见的存储引擎

存储引擎特别注意的是,存储引擎是基于表的,而不是数据库。1. InnoDB是 MySQL 默认的事务型存储引擎,它被设计用来处理大量的短期事务,只有在需要它不支持的特性时,才考虑使用其它存储引擎。实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ)。在可重复读隔离级别下,通过 间隙锁(Next-Key Locking)防止幻影读。主索引是聚簇索引,在索引中保存...

2019-04-19 14:37:02 245

原创 数据库事务及实现

一、事务事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。MySQL 默认采用自动提交模式。也就是说,如果不显式使用START TRANSACTION语句来开始一个事务,那么每个查询都会被当做一个事务自动提交。2. ACID1. 原子性(Atomicity)事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,...

2019-04-19 00:40:25 410

原创 MySQL 基础

一、B+ Tree 原理

2019-04-17 23:36:14 191

原创 Redis 对象的实现

1、简单动态字符串简单动态字符串(simple dynamic string, SDS)是 Redis 的默认字符串表示,是一个可修改的字符串值。Redis 只使用C字符串作为字面量,在大多数情况下,Redis使用SDS作为字符串表示。STRING 的底层实现之一。1.1 SDS 的定义1.2 SDS 的空间预分配当SDS需要空间拓展时,程序会预先分配SDS一些额外的空间。即当SDS...

2019-04-16 13:55:22 187

原创 Redis 对象的使用

一、概述Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串(STRING)、列表(LIST)、集合(SET)、散列表(HASH)、有序集合(...

2019-04-14 17:56:14 173

原创 B树和B+树的对比

一、B树4阶指每个节点最多有4个子树。从查找效率考虑一般要求B树的阶数m >= 3。二、B+树-> B+树平衡三、B+树和B树的区别有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接(...

2019-04-09 15:44:13 355

原创 SQL 语句进阶

MySQL 的数据类型SELECT prod_name FROM products LIMIT 5,4; // 返回从5行开始的4行,即5~8行。(从0行开始)SELECT prod_id, prod_name FROM products ORDER BY prod_id DESC, prod_name LIMIT 3;// 按照 prod_id 降序排列,如果 prod_id ...

2019-04-08 17:05:55 369

原创 JDK 1.8 ThreadLocal 源码解析

可以使用 java.lang.ThreadLocal 类来实现线程本地存储功能。

2019-03-31 22:42:47 454

原创 Java Vector & CopyOnWriteArrayList 解析

.

2019-03-19 16:07:02 331

原创 Java 基础学习笔记

基本类型自动转换float f = 1.1 // 编译错误 “possible lossy conversion from double to float”1.1默认是double类型,这里为向下转型(double -> float),Java 不能隐式执行向下转型,但可以隐式执行向上转型。float f = 1 // 编译通过1默认为int类型,向上转型可以隐式执行。float ...

2019-03-19 00:59:15 845 1

原创 Java 集合类(容器类)概览

Collection 接口,继承自 Iterable接口,表示存储着对象的集合。Collection 实现了 Iterable 接口,其中的 iterator() 方法能够产生一个 Iterator 对象,通过这个对象就可以迭代遍历 Collection 中的元素。从 JDK 1.5 之后可以使用 foreach 方法来遍历实现了 Iterable 接口的聚合对象。结构 (I表示...

2019-03-18 23:20:19 218

原创 HTTP 及 HTTPS 基础

URL 只支持 ASCII 码,区分大小写。域名不区分大小写。一、请求和响应报文二、HTTP 方法二、HTTP 状态码服务器返回的 响应报文 中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。1XX 信息100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。2XX 成功200 OK204 No Co...

2019-02-24 22:28:09 719

原创 TCP/IP 回顾

0. 概况路由器不涉及运输层。采用分组交换,放弃电路交换。套接字用(IP地址:端口号)表示。五层协议:其中表示层和会话层用途如下:表示层 :数据压缩、加密以及数据描述,这使得应用程序不必关心在各台主机中数据内部格式不同的问题。会话层 :建立及管理会话。1. 物理层根据信息在传输线上的传送方向,分为以下三种通信方式:单工通信:单向传输半双工通信...

2019-02-24 00:00:35 372

原创 设计模式基础

.

2019-01-15 19:44:54 349

原创 Java 五种单例模式

单例模式有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一实例。 单例模式确保某个类只有一个实例。单例模式实现有两种方式:1. 饿汉模式public class HungrySingle { //这里方法均为static,其他类可直接使用。 private static final Hung

2019-01-15 13:12:58 439

原创 SQL 笔记(二)

1、创建表CREATE TABLE SC(Sno int,Qno int,primary key(Sno),foreign key(Qno) references Course(Cno));这里声明Sno为主键,声明Qno为外键,并指定Qno关联的是Course表中的Cno项,其中Cno必须为Course表中的主键。 2、修改表Alter table tablename add sex cha

2019-01-14 00:29:50 551

原创 JDK 1.6 synchronized 锁优化

在进行并发操作时为保证线程安全会使用各种锁,此文初步介绍各种锁的概念。1. 悲观锁 (操作前先获取锁)总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在做操作...

2019-01-11 13:48:09 585

原创 Java 语言中的线程安全

线程安全:多个线程不管以何种方式访问某个类,并且在主调代码中不需要进行同步,都能表现正确的行为。线程安全有以下几种实现方式:不可变不可变(Immutable)的对象一定是线程安全的,不需要再采取任何的线程安全保障措施。只要一个不可变的对象被正确地构建出来,永远也不会看到它在多个线程之中处于不一致的状态。多线程环境下,应当尽量使对象成为不可变,来满足线程安全。不可变的类型:final 关...

2019-01-11 10:14:51 230

空空如也

空空如也

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

TA关注的人

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