May 30, 2017

Redis源码学习之Redis事务

Redis作为一个内存型数据库,同样支持传统数据库的事务特性。这篇文章会从源代码角度来分析Redis中事务的实现原理。

What

Redis事务提供了一种将多个命令请求打包,然后一次性、按照顺序地执行多个命令的机制,并且在事务执行的期间,服务器不会中断事务而去执行其他不在事务中的命令请求,它会把事务中所有的命令都执行完毕才会去执行其他的命令。

How

Redis中提供了multi、discard、exec、watch、unwatch这几个命令来实现事务的功能。

Redis的事务始于multi命令,之后跟着要在事务中执行的命令,终于exec命令或者discard命令。加入事务中的所有命令......

May 30, 2017

Bootstrap源码分析

不管是客户端使用的Bootstrap还是服务端使用的ServerBootstrap都是继承自AbstractBootstrap,AbstractBootstrap的定义如下

public abstract class AbstractBootstrap<B extends AbstractBootstrap<B, C>, C extends Channel> implements Cloneable {

}

从定义中可见AbstracpBootstrap实现了Cloneable接口,能够进行复制。

Server端:ServeBootstrap

正如前文介绍的......

May 30, 2017

Java对象大小

一个Java对象的大小包括下面三个部分

1. 对象头(Header)

2. 实例数据(Instance Data)

3. 对齐填充(Padding)

对象头(Header)

对象头在32位系统上占用8bytes,在64位系统上占用16bytes。

实例数据(Instance data)

Java中原生类型(Primitive Type)的内存占用情况如下:

Primitive Type

Memory Required(bytes)

boolean

1

byte

1

short

2

char

2

int

4

long

8

float

4

d......

May 20, 2017

Redis源码学习之事件驱动

Redis基于多路复用技术实现了一套简单的事件驱动库,代码在ae.h、ae.c以及ae_epoll.c、ae_evport.c和ae_kqueue.c、ae_select.c这几个文件中。其中ae表示的是antirez eventloop的意思。

Redis里面包含两种事件类型:FileEvent和TimeEvent。

Redis采用IO多路复用技术,所有的事件都是在一个线程中进行处理。Redis的事件驱动模型可以以以下为代码进行表示:

int main(int argc,char **argv)

{

while(true) {

// 等待事件到来:wait4Ev......