note-book-the-design-and-implementation-of-redis
本文不适合学习,偏向复习用
相关文章:Redis笔记——Redis设计与实现
数据结构与对象
看前须知
对象章节的有些内容最好提前了解下,比如以下内容:
在 Redis 的数据库中新创建一个键值对时, 我们至少会创建两个对象, 一个对象用作键值对的键(键对象), 另一个对象用作键值对的值(值对象)
对于 Redis 数据库保存的键值对来说, 键总是一个字符串对象, 而值则可以是字符串对象、列表对象、哈希对象、集合对象或者有序集合对象的其中一种
当我们称呼一个数据库键为“字符串键”时, 我们指的是“这个数据库键所对应的值为字符串对象”
当我们称呼一个键为“列表键”时, 我们指的是“这个数据库键所对应的值为列表对象”
简单动态字符串(Simple Dynamic String,SDS)
在Redis中,有两种字符串,一种是传统的C字符串,通常仅用于无需修改的地方(例如日志中)。
而如果Redis需要一个可以修改的字符串,就会使用SDS(键值对的字符串都是使用SDS)
SDS定义
123456789struct sdshdr { // 记录 buf 数组中已使用字节的数量 ...
note-book-java-vm
《深度理解Java虚拟机》阅读笔记
Java内存区域与内存溢出异常
运行时数据区域
程序计数器
当前线程所执行的字节码的行号指示器,控制程序的分支、循环、跳转、异常处理和线程恢复等功能
每条线程都需要有个独立的程序计数器,线程之间计数器互不影响(线程私有)
执行Java方法时,计数器记录的时正在执行的虚拟机字节码指令地址;执行本地方法时,计数器值为空
Java虚拟机栈
线程私有
执行方法时,vm都会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息
方法被调用的过程对应一个栈帧从入栈到出栈的过程
如果线程请求的栈深度超出vm所允许的深度,则会抛出StackOverflowError异常。如果vm可以动态分配栈容量(深度),当栈扩展到无法申请到足够的内存时,则会抛出OutOfMemoryError异常。(HotSpot vm时不可以动态扩展的,以前的Classic vm倒是可以)
局部变量表
存放编译期可知的各种vm基本数据类型、对象引用和returnAddress类型
这些数据类型的存储空间以局部变量槽来表示,64位的long和double占用两个变 ...