JavaAgent入门

概述

JavaAgent 是JDK 1.5 以后引入的,也可以叫做Java代理。

JavaAgent 是运行在 main方法之前的拦截器,它内定的方法名叫 premain ,也就是说先执行 premain 方法然后再执行 main 方法。

主要功能如下:

  • 可以在加载class文件之前做拦截,对字节码做修改;
  • 可以在运行期对已加载类的字节码做变更;
  • 获取所有已经加载过的类;
  • 获取所有已经初始化过的类;
  • 获取某个对象的大小;
  • 将某个jar加入到Bootstrap classpath中作为高优先级被BootstrapClassloader加载;
  • 将某个jar加入到classpath中供AppClassloader取加载;

按照加载时机可以分为两种:

  • 程序启动前
  • 程序启动后

阅读全文

Redis源码(7):Sentinel模式

哨兵模式

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

哨兵有两个作用:

  • 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
  • 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

阅读全文

Redis源码(6):集合

概述

集合Set, 集合成员是唯一的,这就意味着集合中不能出现重复的数据。

阅读全文

Redis源码(5):跳跃表

跳跃表

跳跃表的定义在server.h中

阅读全文

Redis源码(4):字典

概述

字典又称为符号表或者关联数组、或映射(map),是一种用于保存键值对的抽象数据结构。字典中的每一个键 key 都是唯一的,通过 key 可以对值来进行查找或修改。C 语言中没有内置这种数据结构的实现,所以字典依然是 Redis自己构建的。

阅读全文

Redis源码(3):链表

概述

链表是一种比较基础的数据结构,主要在插入和删除时效率较高。Redis实现的是双向链表。

阅读全文

Redis源码(2):简单动态字符串SDS

概述

Redis并没有使用c语言本身的字符串类型,而是自己构建了一种名为 简单动态字符串(simple dynamic string,SDS)的抽象类型,并将 SDS 作为 Redis的默认字符串表示。

阅读全文

分库分表历史数据迁移

概述

历史数据为一个时间点前的所有数据,是一个固定数量的记录。

对于历史数据迁移有两个比较粗略的方案:

  1. 运维团队提供数据库迁移工具,数据库层面直接迁移;
  2. 自己开发数据迁移程序,通过sql的方式进行迁移;

阅读全文

Redis源码(1):数据结构及底层实现

Redis数据结构

redis 共有5个数据类型:

  1. 字符串/整型/浮点数;
  2. 列表(List);
  3. 哈希表(Hash);
  4. 集合(Set);
  5. 有序集合(sorted set);

注:本文Redis版本为5.0

阅读全文

Redis源码(1):数据结构及底层实现

Redis数据结构

redis 共有5个数据类型:

  1. 字符串/整型/浮点数;
  2. 列表(List);
  3. 哈希表(Hash);
  4. 集合(Set);
  5. 有序集合(sorted set);

注:本文Redis版本为5.0

阅读全文