• Redis数据结构源码解析(三) 跳跃表

    概念跳跃表类似一个多层的链表,首先从最高层开始查找,如果下一个节点的值大于要查找的值或者下一个节点为null,则往下一层查找。通过空间换时间的策略,将时间复杂度控制在O(logn)。 图例 例如查找51这个数 首先从第一层开始查找,找到第二个节点,发...
  • Redis数据结构源码解析(二) 字典

    对比HashMap字典的使用和底层与Java中的HashMap还是很像的,比较特殊的就是扩容方式。 基本结构 dict123456789101112typedef struct dict { // 操作类型 dictType *...
  • Redis数据结构源码解析(一) SDS

    C语言存储字符串的问题C语言中没有类似Java中的String高级对象在Java中 String用的不亦乐乎,其自带的 equals、split、charAt等方法真的很方便,但是C是没有这种高级对象的。 如果在C语言中使用字符串有两种方式: 使用...
  • Redis数据结构源码解析(〇) 五大数据类型

    前言本文不介绍具体使用,已底层实现为主。先宏观介绍下实现方式具体实现后续文章介绍。 数据类型 字符串 String 列表 List 集合 Set 有序集合 ZSet 哈希 Hash 数据编码1234567891011#define OBJ_ENCO...
  • 关于Mysql的江湖传言

    谣言粉碎机谁说必须遵循最左匹配原则?创建组合索引在查询语句时必须遵循最左匹配原则,即 where 时组合索引的第一个索引列必须在最前面。不然会索引失效!这是常见的八股文了,原理上没毛病,在B+树上每个非叶子节点不可能逐个比较条件语句,通过组合索引的第...
  • JVM 内存结构

    前言根据上图我们发现 Java 内存结构由堆、虚拟机栈、方法区、程序计算器、本地方法栈。如果分为两种类型则是:线程共享的 和 线程私有的。 线程私有程序计数器(PC Register)在图中看到了很大一块程序计数器其实在现实中只是开辟了很小很小的一部...
  • String str = "hello"; 和 String = new String("hello"); 的区别

    前言12String str = "hello"; String = new String("hello"); 如上两个方法都可以得到我们想要的一个字符串,但是区别还是有的. 堆和常量池的关系 堆(Heap...
  • Java new 一个对象都经历了什么

    前言 Java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。由此得出一个new一个java对象包括两个过程:加载和创建 加载类 java是使用...
  • ReentrantLock 公平锁与非公平锁

    实例化在实例化 ReentrantLock 的时候可以加一个构造参数。 12345// 传true时为公平锁ReentrantLock lock = new ReentrantLock(true);// 非公平锁ReentrantLock lock ...
  • ReentrantLock 如何保证重入

    公平锁:1234567891011121314// java.util.concurrent.locks.ReentrantLock.FairSync#tryAcquireif (c == 0) { if (!hasQueuedPredec...