2023年3月25日
摘要: Redis为什么使用skiplist而不是平衡树 Redis中的skiplist主要是为了实现sorted set相关的功能,红黑树当然也能实现其功能,为什么redis作者当初在实现的时候用了skiplist而不是红黑树、b树之类的平衡树? 而且显然红黑树比skiplist更节省内存啊! Redis 阅读全文
posted @ 2023-03-25 22:21 zhengbiyu 阅读(13) 评论(0) 推荐(0) 编辑
摘要: 数据结构 /* ZSETs use a specialized version of Skiplists */ typedef struct zskiplistNode { sds ele; double score; struct zskiplistNode *backward; struct z 阅读全文
posted @ 2023-03-25 22:09 zhengbiyu 阅读(44) 评论(0) 推荐(0) 编辑
摘要: redis做分布式锁采用set命令实现。 set指令扩展参数:SET key value[EX seconds][PX milliseconds][NX|XX] - NX :表示key不存在的时候,才能set成功,也即保证只有第一个客户端请求才能获得锁, 而其他客户端请求只能等其释放锁,才能获取。 阅读全文
posted @ 2023-03-25 19:13 zhengbiyu 阅读(9) 评论(0) 推荐(0) 编辑
摘要: 参考数据类型与底层数据结构,Hash类型存在压缩列表和字典两种数据结构。 当Hash中节点比较少的情况下,底层才用压缩列表ziplist进行存储数据,随着数据的增加,底层的ziplist就可能会转成字典结构,具体配置如下: filed元素个数小于 hash-max-ziplist-entries(默 阅读全文
posted @ 2023-03-25 16:54 zhengbiyu 阅读(15) 评论(0) 推荐(0) 编辑
摘要: 字典结构 typedef struct dict { // 类型特定函数 dictType *type; // 私有数据 void *privdata; // 哈希表 dictht ht[2]; // rehash 索引 // 当 rehash 不在进行时,值为 -1 int rehashidx; 阅读全文
posted @ 2023-03-25 16:47 zhengbiyu 阅读(36) 评论(0) 推荐(0) 编辑
摘要: 压缩列表实际上类似于一个数组,数组中的每一个元素都对应保存一个数据。 压缩列表结构 struct ziplist<T> { int32 zlbytes; int32 zltail_offset; int16 zllength; T[] entries; int8 zlend; } zlbytes:整 阅读全文
posted @ 2023-03-25 16:28 zhengbiyu 阅读(32) 评论(0) 推荐(0) 编辑
摘要: 当保存 64 位有符号整数时,String 类型会把它保存为一个 8 字节的 Long 类型整数,这种保存方式通常也叫作 int 编码方式。 当保存的数据中包含字符时,String 类型就会用简单动态字符串(Simple Dynamic String,SDS)结构体来保存,如下图所示: buf:字节 阅读全文
posted @ 2023-03-25 16:09 zhengbiyu 阅读(61) 评论(0) 推荐(0) 编辑
摘要: 为了实现从键到值的快速访问,Redis 使用了一张全局哈希表来保存所有键值对。 数据类型与底层数据结构 String 类型的底层实现只有一种数据结构,也就是简单动态字符串。而 List、Hash、Set 和 Sorted Set 这四种数据类型,都有两种底层实现结构。通常情况下,我们会把这四种类型称 阅读全文
posted @ 2023-03-25 15:53 zhengbiyu 阅读(18) 评论(0) 推荐(0) 编辑
摘要: 32位虚拟机和64位虚拟机下的Java对象头内存模型: 本地环境是jdk1.8,64位虚拟机,这里我以64位虚拟机(开启指针压缩)来分析,因为默认情况下,jdk1.8 在64位虚拟机默认开启指针压缩。 Java 对象头主要包括两部分,第一部分就是 Mark Word,这也是 Java 锁实现原理中重 阅读全文
posted @ 2023-03-25 15:46 zhengbiyu 阅读(26) 评论(0) 推荐(0) 编辑