1. 概述

  Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

  Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

2. 基本结构

typedef struct dictEntry {
void *key; // 键
// 值
union {
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
struct dictEntry *next; // 指向下个节点的指针, hash 值相同的键值对构成单向链表 头插法
} dictEntry; // 哈希表结构。 每个字典都有两个,因为我们实现了从旧表到新表的增量重写
typedef struct dictht {
dictEntry **table;
PORT_ULONG size; // hash 表大小
PORT_ULONG sizemask; // 哈希表大小掩码,用于计算索引值,总是等于 size - 1
PORT_ULONG used; // 节点个数
} dictht; typedef struct dict {
dictType *type; // 类型特定函数 实现多态
void *privdata; // 私有数据
dictht ht[]; // 两个 hash table
PORT_LONG rehashidx; // 如果rehashidx == -1则不进行重复
int iterators; // 当前正在运行的迭代器数
} dict;

3. 渐进式 rehash

  a. 它就是一个键值对,对于hash冲突的处理采用了头插法的链式存储来解决。新节点添加到链表的表头位置

  b. 对rehash,扩展就是取第一个大于等于 used * 2 的2 ^ n的数作为新的hash表大小;缩紧就是取第一个大于等于 used 的2 ^ n的数作为新的hash表大小。

  c. 有个负载因子的概念(负载因子 = used / size),没有执行BGSAVE或者BGREWRITEAOF时 大于1就会扩展,小于0.1就会缩紧。

3.1 详细步骤

  1. 为 ht [1] 分配空间, 字典同时持有两个哈希表
  2. rehashidx 设置为 0 , rehash正式开始
  3. rehash 期间, 每次对字典的增删改查操作时, 程序除了执行特定的操作外, 还会将 ht [0] 中节点数组的 rehashidx 位置上的 数据迁移到 ht [1] , 然后 rehashidx +1;
  4. 当rehash完成后, rehashidx 赋值为 -1 ;

3.2 rehash期间的哈希表操作

  rehash 期间, 哈希表的 删改查 操作先在 ht [0] 上执行, 找不到则在 ht [1]上进行操作.

  增加操作在 ht [1]上进行操作,

  保证 ht[0]上的数据只减不增,

Redis---Hash(字典)的更多相关文章

  1. Redis学习系列四Hash(字典)

    一.简介 Redis中的Hash字典相当于C#中的Hashtable,是一种无序字典,内存存储了很对的键值对,实现上和Hashtable一样,都是"数组+链表"二维结构,都是对关键 ...

  2. python处理json和redis hash的坑

    1.使用MySQLdb读取出来的数据是unicode字符串,如果要写入redis的hash中会变成 "{u'eth0_outFlow': 2.5, u'eth1_inFlow': 3.44} ...

  3. 深入redis内部--字典实现

    redis的字典定义和实现在dict.h和dict.c文件中. 1.字典结构 typedef struct dict { dictType *type; //定义了字典需要的函数 void *priv ...

  4. Python --Redis Hash操作

    一.Redis Hash操作 Redis 数据库hash数据类型是一个string类型的key和value的映射表,适用于存储对象.Redis 中每个 hash 可以存储 232 - 1 键值对(40 ...

  5. Redis之字典

    概念 字典,又称为符号表.关联数组或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构.字典中每个键都是独一无二的,程序可以根据键来更新值,或者删除整个键值对. 用途 ...

  6. 【Redis】字典

    Redis 字典 基本语法 字典是Redis中的一种数据结构,底层使用哈希表实现,一个哈希表中可以存储多个键值对,它的语法如下,其中KEY为键,field和value为值(也是一个键值对): HSET ...

  7. redis学习(二) Redis Hash

    Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿). redis ...

  8. redis hash map

    redis hash的使用详见文章:http://www.miaoyueyue.com/archives/235.html hash操作命令如下: hset(key, field, value):向名 ...

  9. ***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象

    http://redis.readthedocs.org/en/latest/hash/hset.html HSET HSET key field value   (存一个对象的时候key存) 将哈希 ...

  10. Redis hash数据类型操作

    Redis hash是一个string类型的field和value的映射表.一个key可对应多个field,一个field对应一个value.将一个对象存储 为hash类型,较于每个字段都存储成str ...

随机推荐

  1. 33、iOS10 由于权限问题导致崩溃的大坑

    控制台报忠告: This app has crashed because it attempted to access privacy-sensitive data without a usage d ...

  2. 2019.01.24 bzoj3125: CITY(轮廓线dp)

    传送门 题意简述:给一个n∗mn*mn∗m的网格图,有的格子不能走,有的格子只能竖着走,有的格子只能横着走,问用一条回路覆盖所有能走的格子的方案数. 思路: 就是简单的轮廓线dpdpdp加了一点限制而 ...

  3. Spring+mvc错误

    1.2016-11-13 16:49:22 原因:@ResponseBody注解没加

  4. (7)Why 30 is not the new 20

    https://www.ted.com/talks/meg_jay_why_30_is_not_the_new_20/transcript 00:12When I was in my 20s, I s ...

  5. boost--function

    1.简介 function是一个模板类,它就像一个包装了函数指针或函数对象的容器(只有一个元素).可以把它想象成一个泛化的函数指针,而且他非常适合代替函数指针,存储用于回调的函数.如下定义了一个能够容 ...

  6. shell常见命令

    awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk ''  | output 1.首先要知道形式 awk 'command' fi ...

  7. jquery删除onclick属性和设置onclick属性--获取验证码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. java web 大文件下载

    泽优大文件下载产品测试 泽优大文件下载控件down2,基于php开发环境测试. 开发环境:HBuilder 服务器:wamp64 数据库:mysql 可视化数据库编辑工具:Navicat Premiu ...

  9. mybatis-generator扩展教程系列 -- 自定义generatorConfig.xml参数

    http://blog.csdn.net/shadowsick/article/details/53413235

  10. AIX nfs简单说明

    AIX 系统 NFS设置 一.NFS守护进程:NFS是通过使用许多用户级的守护进程及远程过程调用等网络应用程序来实现的.而NFS服务器及客户端的守护进程并不完全一致. 1. 作为NFS服务器所需的守护 ...