Redis笔记之基本数据结构 字典

字典

符号表、关联数组或者映射,有点类似于java中的map,用于保存键值对key-value。字典中的键key是独一无二的。底层实现为哈希表。下面进行简述:

  • 哈希表。哈希表主要包含table数组、size、sizemask以及used。table用于保存哈希表节点,保存数据;sizemask为哈希表掩码用于计算索引;size用于保存table大小;used用于保存已经保存的节点数目,如图dictht结构体。
  • 哈希表节点。用于保存key-value数据,以及next指针用于指向下一个节点,为了解决哈希冲突而采用的拉链法。
typedef struct dictEntry{void *key;union{void *val;uint64_t u64;int64_t s64;} v;struct dictEntry *next;
} dictEntry;
  • 字典。主要包含type、privdata、ht[2]、rehashidx几个属性。type表示字典数据类型;privdata保存了需要传递给type指定类型函数的可选参数;ht[2]指向两个哈希表,一个用于平时保存数据,另一个用于rehash(扩容等)时使用;rehashidx在rehash使用,用于表示当前正在转移table中第几个索引的数据。整体结构茹下图。
    在这里插入图片描述

哈希算法以及rehash

  • 哈希算法。首先,计算key的哈希值然后使用掩码sizemask求得在table中的索引(例如, hash & sizemask),然后使用头插法直接插入,使用链地址法解决哈希冲突。
  • rehash。当哈希表的负载因子过大或者过小时,需要进行扩展以及压缩,这个时候需要rehash,也就是需要重新计算当前值在新的table中的位置;扩展时,扩展为第一个大于等于ht[0].used*2的2的n次幂、压缩时,压缩为第一个大于等于ht[0].used的2的n次幂;负载因子等于used/size,当当前正在进行持久化时(BGSAVE或者BGREWRITEAOF),负载因子大于等于5扩展,平常选择1,当负载因子小于0.1时,进行压缩。rehash时,查询操作,先到ht[0]中查询,如果没有再去ht[1]中查询,插入新数据时,直接在ht[1]中插入。rehashidx默认为-1,当rehash时,保存的为正在转移的ht[0]中table的索引。

本文为《Redis设计与实现》阅读笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【零基础学习iOS开发】【02-C语言】02-第一个C语言程序

本文目录 前言一、编写第一个C语言程序-Hello World二、编译程序三、链接程序四、运行程序五、总结六、学习建议七、clang指令汇总回到顶部前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法。学习任何一门语言&#xff…

安卓平板体验Java开发,还能白嫖一年阿里无影云,真香!(内含白嫖方法,人人可领)...

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)阿里无影云早有耳闻,前两天看朋友发体验照片,可能是程序员天生爱折腾的特性又发挥作用了&#xff0c…

Linux命令(三)

echo:输出信息echo ”abc”echo “字符串” |passwd --stdin USERNAME :利用管道修改用户密码输出重定向:>覆盖输出(会覆盖原文件中的内容)>>追加输出 (原有内容会被保留)Set –c &#xff1a…

strictmath_Java StrictMath scalb()方法与示例

strictmathStrictMath类scalb()方法 (StrictMath Class scalb() method) Syntax: 句法: public static double scalb(double do , int sf);public static float scalb(float fl , int sf);scalb(double do , int sf) method is used to return do* 2 raised to the…

你知道group by的工作原理和优化思路吗?

前言 日常开发中,我们经常会使用到group by。亲爱的小伙伴,你是否知道group by的工作原理呢?group by和having有什么区别呢?group by的优化思路是怎样的呢?使用group by有哪些需要注意的问题呢?本文将跟大家…

strictmath_Java StrictMath hypot()方法与示例

strictmathStrictMath类hypot()方法 (StrictMath Class hypot() method) hypot() method is available in java.lang package. hypot()方法在java.lang包中可用。 hypot() method is used to return the square root of sqrt(sq(d1)sq(d2)) without any intermediate operation…

关Jquery判断input type=checkbox元素是否被选中的判断

2019独角兽企业重金招聘Python工程师标准>>> 在用到复选框的时候&#xff0c;想在js中判断chekbox是否被选中 <input name"isPermit" id"isPermit" type"checkbox"> 百度了很多的判断方法 1、 if($("#isPermit").att…

Redis夺命十二问,你能扛到第几问?

Redis是面试中绕不过的槛&#xff0c;只要在简历中写了用过Redis&#xff0c;肯定逃不过。今天我们就来模拟一下面试官在Redis这个话题上是如何一步一步深入&#xff0c;全面考察候选人对于Redis的掌握情况。小张&#xff1a;面试官&#xff0c;你好。我是来参加面试的。面试官…

Java Scanner nextLine()方法与示例

扫描仪类nextLine()方法 (Scanner Class nextLine() method) nextLine() method is available in java.util package. nextLine()方法在java.util包中可用。 nextLine() method is used to get the skipped line. nextLine()方法用于获取跳过的行。 nextLine() method is a non…

bzoj 1192

http://www.lydsy.com/JudgeOnline/problem.php?id1192 好像学过一个东西&#xff1a; [0..2^(N1)-1]内的数都的都可以由2^0,2^1,...,2^N这N1个数中若干个相加得到。 #include<cstdio> #include<cstdlib> #include<iostream> #include<fstream> #incl…

Spring Boot Admin 报警提醒和登录验证功能实现!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;Spring Boot Admin&#xff08;SBA&#xff09;是一个开源的社区项目&#xff0c;用于管理和监控 Spring Boot 应用程序&…

Java Hashtable rehash()方法与示例

哈希表类rehash()方法 (Hashtable Class rehash() method) rehash() method is available in java.util package. rehash()方法在java.util包中可用。 rehash() method is used to extend the capacity and it is invoked implicitly if the number of keys limit exceeds hash…

企业Shell面试题18:单词及字母去重排序案例

1、按单词出现频率降序排序&#xff01; 2、按字母出现频率降序排序&#xff01; the squid project provides a number of resources to assist users design,implement and support squid installations. Please browse the documentation and support sections for more inf…

5种高大上的yml读取方式,你知道几种?

我们今天就来点实战&#xff0c;总结一下除了烂大街的Value和ConfigurationProperties外&#xff0c;还有哪些读取yml配置文件的方法&#xff1f;1、Environment在Spring中有一个类Environment&#xff0c;它可以被认为是当前应用程序正在运行的环境&#xff0c;它继承了Proper…

Java Hashtable equals()方法与示例

哈希表类equals()方法 (Hashtable Class equals() method) equals() method is available in java.util package. equals()方法在java.util包中可用。 equals() method is used to check whether equality of this Hashtable with the given Object or not. equals()方法用于检…

为什么ConcurrentHashMap不允许插入null值?

作者&#xff1a;磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在 Java 语言中&#xff0c;ConcurrentHashMap 和 Hashtable 这些线程安全的集合是不允许 key 或 value 插…

.NET APlayer播放器 demo

工作需要,想开发一款播放器,当无意间浏览到APlayer的时候大爱啊,有木有迅速投入精力,在APlayer论坛看大牛们的作品及经验,看SDK中提供的chm电子书最后看了博客园中周见智的文章(灰常好!最终作品也用的他的demo改进)先来晒一下最终的效果图片。 效果截图&#xff1a;1.初始界面。…

Java Formatter format()方法及示例

Formatter类format()方法 (Formatter Class format() method) Syntax: 句法&#xff1a; public Formatter format(Locale lo, String frmt, Object... args);public Formatter format(String frmt, Object... args);format() method is available in java.util package. form…

Spring Cloud Alibaba Nacos 服务注册与发现功能实现!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分&#xff0c;它提供了两个重要的功能&#xff1a;服务注册与发现和统一…

Java类class cast()方法及示例

类class cast()方法 (Class class cast() method) cast() method is available in java.lang package. 在java.lang包中提供了cast()方法 。 cast() method casts this Object to the class or an interface denoted by this Class object. cast()方法将此Object强制转换为该Cl…