Redis Map 存储K-V键值对。(跟Java的Map类比)

哈希表结构:

  typedef struct dictht {

    dictEntry **table;  //哈希表数组

    unsigned long size;  //哈希表大小

    unsigned long sizemask;  //哈希表掩码,用于计算索引值。总是等于 size - 1

    unsigned long used;  //该哈希表已有节点的数量

  } dictht;

哈希表节点结构:

  typedef struct dictEntry {

    void *key;   //键

    union{       //值

      void *val;

      uint64_t u64;

      int64_t s64;

    } v;

    struct dictEntry *next;  //指向下一个哈希表节点,形成链表。

  }

字典结构:

  typedef struct dict {

    dictType *type;  //类型特定函数

    void *privdata;   //私有数据

    dictht ht[2];  //哈希表数组,长度为2。一般情况下使用h[0],在rehash时,使用h[1]进行过渡。

    int trehashidx;  // rehash 索引,当rehash不在进行时,值为 -1。配合ht[2]进行rehash。

  }

结构图如下:

 哈希算法,如何添加一个新值:

  1、计算k的hash值。

  2、由是否进行rehash决定使用h[0],还是h[1](rehash时,用h[1])。

  3、根据k的hash值和sizeMask计算(hash(K) & sizeMash), 得到 table中的 dictEntry[?] 的位置。

  4、用链表法,解决hash冲突。

 rehash : 重新哈希

  1、为ht[1]分配空间。扩展的大小为 ht[0].used 的第一个大于 2n的数。修改trehashidx标识0。

  2、将ht[0]的数据,重新计算得到dictEntry的位置,存入ht[1]。

  3、数据完成迁移后,将ht[0],ht[1]的指针对调。修改trehashidx表示为-1。

  4、哈希方式为渐进式哈希。哈希期间,会操作两个ht。(在ht[1]进行添加操作;先在ht[0]进行删除操作,再到ht[1])

Redis-Map的更多相关文章

  1. redis map存储的注意点

  2. redis发布订阅Java代码实现

    Redis除了可以用作缓存数据外,另一个重要用途是它实现了发布订阅(pub/sub)消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 为了实现redis的发布订阅机制,首先要打开re ...

  3. redis 缓存

    本篇博客只介绍 redis 作为缓存的的一些使用,以及在项目中如何把redis和spring如何集成. 1:redis的maven依赖,redis 依赖   spring-redis 依赖: < ...

  4. sping整合redis,以及做mybatis的第三方缓存

    一.spring整合redis Redis作为一个时下非常流行的NOSQL语言,不学一下有点过意不去. 背景:学习Redis用到的框架是maven+spring+mybatis(框架如何搭建这边就不叙 ...

  5. redis mysql 连接池 之 golang 实现

    1 mysql 连接池代码 package lib import ( "database/sql" "fmt" "strconv" &quo ...

  6. java:redis(java代码操作redis,实体类mapper生成器(generator))

    1.redis_demo Maven  ItemMapper.xml: <?xml version="1.0" encoding="UTF-8" ?> ...

  7. [源码分析] OpenTracing之跟踪Redis

    [源码分析] OpenTracing之跟踪Redis 目录 [源码分析] OpenTracing之跟踪Redis 0x00 摘要 0x01 总体逻辑 1.1 相关概念 1.2 埋点插件 1.3 总体逻 ...

  8. Go 每日一库之 viper

    简介 上一篇文章介绍 cobra 的时候提到了 viper,今天我们就来介绍一下这个库. viper 是一个配置解决方案,拥有丰富的特性: 支持 JSON/TOML/YAML/HCL/envfile/ ...

  9. 7.Docker容器使用辅助工具汇总

    原文地址: 点击直达 more information: https://docs.docker.com/engine/security/security/#docker-daemon-attack- ...

随机推荐

  1. JavaScript求数组Array的并集(javascript面试常见题目)

    var Utils = { joinArray:function(source,target){ for(var i = 0;i<source.length;i++){ var oa = sou ...

  2. 解决 sublime text 3 there are no packages available for installation 错误

    重装win7 系统后,使用sublime text 3 出现下面的错误提示: 经过摸索,解决方案如下: 第一种方法: 是因为 ipv6 的问题,导致无法访问 sublime 官网,解决方法: 在 ho ...

  3. docker微服务部署之:二、搭建文章微服务项目

    docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...

  4. leetcode-844-比较含退格的字符串(用vector取代stack)

    题目描述: 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = ...

  5. Win10将用户名修改为英文

    前言 最近重装了一次Win10系统,手贱地在引导里设置了中文的用户名.使用微软账户进行登录后,Win10以这个中文名建立了用户的文件夹,使得少数软件安装或使用过程中,保存路径不支持中文路径,从而报错, ...

  6. 4. C++11非受限联合体

    在C/C++中,联合体是一种构造类型的数据结构.在一个联合体内,我们可以定义多种不同的数据类型,这些数据类型共享相同的内存空间,可以达到节省内存空间的目的. 1. 取消数据类型的限制 在C++98中, ...

  7. stark - 5 ⇲ 其他常用功能

    Ⅰ 排序 当数据量增多,对于数据 我们应该能够指定如何排序的.且此功能应该是可以给用户自定义进行配置的. 这是StarkHandler类的方法1 order_list = [] def get_ord ...

  8. smtp自动发送邮件demo

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  9. maven子模块转化成project

    把maven多模块中的子模块单独形成一个eclipse的project,需要使用导入 选中子模块,右键选择Import... 在选择弹出框中选择Maven--Existing Maven Projec ...

  10. Hardware Emulation Platform (硬件仿真平台) 在IC验证中的运用情况如何?

    三个EDA公司都有自己的hardware emulation verification platform: Cadence Palladium, Synopsys ZeBu, Mentor Veloc ...