Redis数据结构(二)字典

Redis字典其实就是Hash表,其实现和JAVA语言中的hashmap结构大同小异,按Key-Value方式存储键值对,但是又存在一定的差异。

java中的hashmap结构即包含hash表,又实现了rehash自我扩充;

而redis字典则通过dictht结构实现hash表,通过字典(dict)实现rehash(字典中包含一个dictht数组dictht ht[2])。

Redis字典的实现

Redis字典所使用的哈希表由dict.h/dictht结构定义:

typedef struct dictht{
dictEntry **table;
unsigned long size;
unsigned long sizemask;
unsigned long used;
}dictht;

table为一个dictEntry结构的数组,每个dictEntry结构保存着一个key-value对。size为table数组的大小(注意不是key-value对的个数);used才是key-value对的个数;sizemask为size-1,用途后面会提到;

dictEntry结构定义如下:

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

key即为键,v即为值,由定义可以看出,v既可以是一个指针,也可以是一个uint64_t整数或者int64_t整数。

next属性指向下一个dictEntry,形成链表结构。在字典结构中,每一个key-value中的key的hash值映射到table的下标,如果有多个key的hash值映射到table的同一个下标,则这些key-value对将通过 next指针形成一个链表,存到table的当前下标中。

Redis中的字典由dict.h/dict结构表示:

typedef struct dict{
dictType *type;
void *privdata;
dictht ht[2];
int rehashidx;
} dict;

注意到,其中:

  • dictht即为前面介绍的哈希表结构;
  • type指针为一个dictType结构,该结构保存了一些用于操作特定类型键值对的函数,Redis会为用途不同的字典设置不同的类型特定函数;
  • privdata则保存了需要传递给type中特定函数的可选参数;

    dictType结构如下:

typedef struct dictType{
//计算hash值
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;
  • ht数组则包含2个dictht结构,平时只使用ht[0],在rehash的时候使用ht[1];
  • rehashidx则为一个标志位,如果当前没有在进行rehash,则值为-1;redis通过渐进方式进行rehash,rehash期间,每执行一次操作,则rehashidx值加1;

Redis哈希算法

(未完待续。。。)

时间: 2024-10-03 02:38:33

Redis数据结构(二)字典的相关文章

redis学习(二) redis数据结构介绍以及常用命令

redis数据结构介绍 我们已经知道redis是一个基于key-value数据存储的数据结构数据库,这里的key指的是string类型,而对应的value则可以是多样的数据结构.其中包括下面五种类型: 1.string 字符串 string字符串类型是redis最基础的数据存储类型.string是最基础的一种数据类型,其可以拓展为某种特定类型,例如普通文本,json字符串,二进制数据等等.就本质上来说,接下来要介绍的hash,list,set等其内部最基础的组成单位依然是string,只不过re

Redis 数据结构使用场景

Redis 数据结构使用场景 redis共有5种数据结构,每种的使用场景都是什么? 一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构,那每种数据结构的使用场景都是什么呢? String——字符串 Hash——字典 List——列表 Set——集合 Sorted Set——有序集合 下面我们就来简单说明一下它们各自

学习之Redis(二)

Redis的对象和数据结构 一.字符串对象(请参考学习之Redis(一):https://www.cnblogs.com/wbq1994/p/12029516.html) 二.列表对象 列表对象的编码可以是ziplist(压缩列表)或者linkedlist(双端链表),当列表对象包含的元素比较少时会会使用压缩列表,否则会使用双端链表.具体策略是,当列表对象同时满足以下两个条件时,将使用压缩列表编码: 1.列表对象保存的所有字符串元素的长度都小于64个字节 2.列表对象保存的元素数量小于512个

Redis(二):命令集构建及关键属性解析

上一篇文章,我们从框架层面,主要介绍了redis的启动过程,以及主要的命令处理流程逻辑.这些更多的都是些差不多的道理,而要细了解redis,则需要更细节的东西. 今天我们稍微内围的角度,来看看几个命令执行的重要方法,深入理解下redis的魅力所在. 首先,我们通过上一章知道,processCommand 是其业务主要入口,我们再来回顾下: // server.c /* If this function gets called we already read a whole * command,

Redis数据类型之字典

Redis数据类型之字典 标签(空格分隔): redis redis的字典 字典又称符号表(symbol table),关联数组(associative array),或者映射(map).是用于保存键值对的一种抽象数据结构. 字典的key是唯一的,对键值对的操作基本都是基于key来操作的.redis中的数据库底层是使用字典来实现的,对于数据库的增删改查都是基于字典来实现的.redis的哈希键也是基于字典来实现的. 具体的实现是在src下的dict.h和dict.c文件 字典的数据结构 哈希表结点

Redis数据结构详解,五种数据结构分分钟掌握

redis数据类型分为:字符串类型.散列类型.列表类型.集合类型.有序集合类型.redis这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作.原子操作:最小的操作单位,不能继续拆分.即最小的执行单位,不会被其他命令插入.高并发下不存在竞态条件.KEY的命名:一个良好的建议是article:1:title来存储ID为1的文章的标题.一.前言.1.获取key的列表:KEYS pattern 通配符有?*[]和转义\2.key是否存在: EXISTS key 存在返回1,不

Redis数据结构之intset

本文及后续文章,Redis版本均是v3.2.8 上篇文章<Redis数据结构之robj>,我们说到redis object数据结构,其有5中数据类型:OBJ_STRING,OBJ_LIST, OBJ_SET,OBJ_ZSET,OBJ_HASH.集合对象set有着广泛的实际业务应用场景,它包含的元素无序并且不能重复及集合间的交.并.差等基础的操作.本篇就来说说Redis暴露给我们使用的set集合对象的底层实现-intset. 其实,可以理解为有序整型集合 intset是一个由整数组成的有序集合,

Redis 数据结构与内存管理策略(下)

Redis 数据结构与内存管理策略(下) Redis 数据类型特点与使用场景 String.List.Hash.Set.Zset 案例:沪江团购系统大促 hot-top 接口 cache 设计 Redis 内存数据结构与编码 OBJECT encoding key.DEBUG OBJECT key 简单动态字符串(simple dynamic string) 链表(linked list) 字典(dict) 跳表(skip list) 整数集合(int set) 压缩表(zip list) Re

Redis学习系列六ZSet(有序列表)及Redis数据结构的过期

一.简介 ZSet可以说是Redis中最有趣的数据结构了,因为他兼具了Hash集合和Set的双重特性,也是用的最多的,保证了value值的唯一性的同时,,同时又保证了高性能,最主要的是还可以给每个Value设置Source(权重),那么我们就可以通过权重进行排序,这在业务上是非常常见的,比如很多地方需要,比如我们需要对所有用户的数学成绩进行排序.对英语等等地例子比比皆是,那么通过ZSet,你将会得到一个响应速度非常快的过程.下面会介绍. ZSet的内部原理是通过跳跃列表来实现的,这里还是不想说太