Redis dict_java redis dict-程序员宅基地

技术标签: hashtable  Linux  Redis  dict  

今天看了redis dict部分的源码(dict.h,dict.c),跟大家分享一下。

这两个文件包含了redis的hashtable的接口和实现。

Redis中hashtable的主要特点是增量rehash,rehash毕竟是一个耗时的操作,redis把它分摊到hashtable的各个小操作中,从而让字典操作性能曲线比较平滑。

既然要增量rehash,就要在一个dict中保留两个hashtable,分批次从hashtable[0]搬运元素到hashtable[1]中。

dict的iterator,iterator分为安全的iterator和不安全的iterator,安全的iterator锁定dict,不让它进行rehash及新增元素,直到它释放为止(dict中对安全iterator进行计数)。(这个做法颇有启发)

redis中hashtable的数组总是2的幂,按照数据结构的理论,理想的应该是素数,作者可能是为了方便或是hash计算时更快速。

dict 中提供了两个hash函数,unsigned int dictGenHashFunction(const void *key, int len);这是大名鼎鼎的MurmurHash2,unsigned int dictGenCaseHashFunction(const unsigned char *buf, int len);这是字符串中常用的hash算法(djb hash),只是不区分大小写,从seed开始,hash*33+char。当然也有获得和设置hash seed的接口。

主要的结构如下:

typedef struct dict {
    dictType *type;
    void *privdata;
    dictht ht[2];
    int rehashidx; /* rehashing not in progress if rehashidx == -1 */
    int iterators; /* number of iterators currently running */
} dict;


typedef struct dictType {
    unsigned int (*hashFunction)(const void *key);
    void *(*keyDup)(void *privdata, const void *key);
    void *(*valDup)(void *privdata, const void *obj);
    int (*keyCompare)(void *privdata, const void *key1, const void *key2);
    void (*keyDestructor)(void *privdata, void *key);
    void (*valDestructor)(void *privdata, void *obj);
} dictType;

/* This is our hash table structure. Every dictionary has two of this as we
 * implement incremental rehashing, for the old to the new table. */
typedef struct dictht {
    dictEntry **table;
    unsigned long size;
    unsigned long sizemask;
    unsigned long used;
} dictht;

typedef struct dictEntry {
    void *key;
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
    } v;
    struct dictEntry *next;
} dictEntry;

有一些简单接口用宏包装,rehash触发的条件是used / size > 5。

一般的操作都会做一步rehash即把一个bucket从ht[0]放到ht[1]中,但是replace接口会做两次,因为会先调用find,再调用Add。

有专门的rehash接口,指定rehash几步,还可以指定花多少时间用于rehash,它实际上是每rehash100步检查下时间知道时间超出。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jollyjumper/article/details/9107933

智能推荐

当软件定义存储(SDS)遇见区块链(BlockChain)-程序员宅基地

文章浏览阅读2.4k次。【编者Peter Ye按】再开始正文之前,先分享我最近思考得出的一段话: 互联网解决了信息随时分享,移动互联网解决了信息随地分享,物联网解决了信息随物分享,而构建在三者基..._软件定义存储的空间

golang使用redis分布式锁_can be used to set the clock drift factor.-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏10次。昨天由于项目需求,需要使用redis分布式锁,在网上找了半天,也没有找到一个简单的教程,经过自己研究,了解简单使用方法,都可以直接拿过来自己用,下面我就发出来给大家分享一下。首先下载 github.com/garyburd/redigo,因为这个分布式锁是根据上面所实现; 下载 gopkg.in/redsync.v1这个就是实现分布式锁的源代码(如果测试需要下载 github.c..._can be used to set the clock drift factor.

22道机器学习常见面试题目汇总!(附详细解答)-程序员宅基地

文章浏览阅读555次。作者 | 数据分析1480来源 | lsxxx2011(1) 无监督和有监督算法的区别?有监督学习:对具有概念标记(分类)的训练样本进行学习,以尽可能对训练样本集外的数据进行标记(分类)预测。这里,所有的标记(分类)是已知的。因此,训练样本的岐义性低。无监督学习:对没有概念标记(分类)的训练样本进行学习,以发现训练样本集中的结构性知识。这里,所有的标记(分..._cda level Ⅲ 面试题

Tomcat安装及配置教程(保姆级)【最新史上最全版】-程序员宅基地

文章浏览阅读10w+次,点赞193次,收藏947次。Tomcat安装及配置教程(保姆级)【最新史上最全版】tomcat保姆级安装教程Tomcat安装教程(以tomcat-9.0.62为例:)1.下载安装包可以从官网下载安装包:(1)从官网下载输入网址进入官网sshttp://tomcat.apache.org/_tomcat安装及配置教程

SPFA算法详解——判断负权环_spfa算法判断负环-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏34次。SPFA(Shortest Path Faster Algorithm)(队列优化)算法是求单源最短路径的一种算法。它是在Bellman-ford算法的基础上加上一个队列优化,减少了冗余的松弛操作,是一种高效的最短路算法。 Bellman-Ford算法虽然可以处理负环,但是时间复杂度为O(ne),e为图的边数,在图为稠密图的时候,是不可接受的。 Bellman-Ford算法的缺点在于,当某一个..._spfa算法判断负环

步进电机定位不准的原因分析_龙印旗帜机步进走不准-程序员宅基地

文章浏览阅读1.3k次。摘要: 步进电机定位不准的原因分析:  1)一般的步进驱动器对方向和脉冲信号都有一定的要求,如:方向信号在第一个脉冲上升沿或下降沿(不同的驱动器要求不一样)到来前数微秒被确定,否则会有一个脉冲所运转的角度与实际需要的转向相反,最 ... 步进电机定位不准的原因分析:   1)一般的步进驱动器对方向和脉冲信号都有一定的要求,如:方向信号在第一个脉冲上升沿或下降_龙印旗帜机步进走不准

随便推点

JAVA面试题:JVM+spring+分布式+并发编程+redis+网络+设计模式!_spring工作于jvm哪个步骤-程序员宅基地

文章浏览阅读270次。此文包含 Java 面试的各个方面,史上最全,苦心整理最全Java面试题目整理包括Java基础+JVM+算法+数据库优化+算法数据结构+分布式+并发编程+缓存等,使用层面广,知识量大,涉及你的知识盲点。要想在面试者中出类拔萃就要比人付出更多的努力,共勉!同时由于文章很长方便大家阅读在这我还整理了一些java面试常问高频的面试专题及答案和学习笔记文件以及视频资料免费分享给大家!java高频面..._spring工作于jvm哪个步骤

codeforces1430E String Reversal Educational Codeforces Round 96 (Rated for Div. 2)-程序员宅基地

文章浏览阅读78次。题目链接:https://codeforces.com/problemset/problem/1430/E题目大意:给你一个长度为n的字符串,你可以执行一次操作使得对其相邻两个字符进行交换你可以对其相邻两个字符进行交换现在要求你给定的字符串变成其镜像的字符串最小需要多少次操作如(aabb -> bbaa abc -> cba)输入与输出:input:第一行一个n代表字符串长度随后跟着一个长度为n的字符串(2 <= n <= 200000)o.

安装使用完虚拟机UltraISO后,删除电脑中多出的“CD驱动器”盘符_rtl_ul-程序员宅基地

文章浏览阅读8.1k次,点赞6次,收藏10次。如何删除安装UltraISO后此电脑中多出的“CD驱动器”盘符?在安装过UltraISO后,通常情况下,Windows 10中会多出一个或数个“CD驱动器”盘符。对很多仅用UltraISO来把Windows镜像制作成Windows安装介质的同学来讲,这个“CD驱动器”的盘符并没有什么实际的作用。那么这期教程。我们就来讨论如何将安装过UltraISO后,“此电脑”中多出的“CD驱动器”盘符删掉..._rtl_ul

FPGA学习笔记之QuartusII中的优化设置-程序员宅基地

文章浏览阅读1.8k次。在学习FPGA中,对工具的使用的依赖性感觉还是很大的。那么在quartusII中,可以在多个阶段对设计进行优化.我使用的版本为11.1(这个版本怎么感觉不稳定呢?总是会突然的出现violation而需要重新启动) 一般都会在assignment/settings中进行设置1.全局优化: 在assignment/settings/如图所示中,physical synthesis ..._quartus 综合 优化

历数近22年计算机科学顶会最佳论文:微软领先,清华国内第一-程序员宅基地

文章浏览阅读164次。机器之心报道,机器之心编辑部。研究人员可能会觉得,如果有一份统计近年来所有 CS 顶会最佳论文的网站就好了。事实上,确实有这样一个网站:来自布朗大学计算机科学助理教授 Jeff Huang 统计了自 1996 年以来,计算机科学领域里所有重要会议的最佳论文。此前,Jeff Huang 还统计过全美 Top 50 大学的计算机系教授出身情况(本科就读大学),并得出了 MIT 第一,清华大学第六的结论...

/usr/bin/ld: /usr/bin/ld: cannot find -lc-程序员宅基地

文章浏览阅读940次。问题描述: 在专题1的交叉工具链讲解部分,使用静态链接方式编译 gcc -static hello.c -o hello, 提示 /usr/bin/ld: /usr/bin/ld: cannot find -lc。 问题原因: 搜索了之后基本确定是因为 /usr/bin/中缺少libc.a 这个文件。 它是编译器静态编译过程中要用的库文件。处理办法:利用QQ群里共享的文件g_/usr/bin/ld: cannot find -lc

推荐文章

热门文章

相关标签