美文网首页
Redis - hash底层数据结构实现

Redis - hash底层数据结构实现

作者: kyo1992 | 来源:发表于2021-04-07 08:11 被阅读0次

实现

hash数据结构底层实现为一个字典(dict),也是redisDb用来存储k-v的数据结构,当数据量比较小,或者单个元素比较小时,使用ziplist存储,数据大小和元素数量阈值可以通过如下参数设置
数量阈值
hash-max-ziplist-entries 512
数据大小
hash-max-ziplist-value 64

实验

127.0.0.1:6379> hmset u:001 username qqqwww age 100 k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> hgetall u:001
 1) "username"
 2) "qqqwww"
 3) "age"
 4) "100"
 5) "k1"
 6) "v1"
 7) "k2"
 8) "v2"
 9) "k3"
10) "v3"
127.0.0.1:6379> object encoding u:001
"ziplist"

当存储的k-v长度较小时,底层是以ziplist存储,hgetall顺序与hmset顺序一致,存储数据内存是连续的,
在ziplist中,每一个key和value都用一个entry进行存储,hgetall的时候,遍历ziplist一次性把数据取出。

127.0.0.1:6379> hmset u:001 username qqqwww age 100 k1 v1 k2 v2 k3 v3 k4 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
OK
127.0.0.1:6379> hgetall u:001
 1) "k4"
 2) "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv"
 3) "k1"
 4) "v1"
 5) "age"
 6) "100"
 7) "k2"
 8) "v2"
 9) "username"
10) "qqqwww"
11) "k3"
12) "v3"
127.0.0.1:6379> object encoding u:001
"hashtable"

然后存储一个key为k4,value为比较大的值之后,底层存储数据结构换成了hashtable。
Redis中提供两个参数设置

# Hashes are encoded using a memory efficient data structure when they have a
# small number of entries, and the biggest entry does not exceed a given
# threshold. These thresholds can be configured using the following directives.
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

hash-max-ziplist-entries 512 表示当k-v数量小于512/2 = 256时,使用ziplist进行存储。
hash-max-ziplist-value 64 表示当其中一个key或value值大于64字节,就会将存储方式从ziplist改成hashtable。

使用ziplist好处

本身hashtable结构的开销就比较大,当hash结构存储的k-v不多,或者k-v的值比较小时,直接用hashtable存储会比较浪费,用ziplist则可以高效利用内存。

与string类型比较

hash只能给key设置过期时间,不能给某一个field设置,hash中如果有某些长期不用,也不会自动释放。
string类型是直接在db最外层上进行key的设置,当key达到hashtable容量时,会产生成倍扩容,需要额外更多的空间。

相关文章

  • redis数据结构(三):字典 dict

    redis的字典使用哈希表作为底层实现。hash表的数据结构 hash表节点数据结构 这里看到链表了吧。redis...

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

    字典(dict) dict字典是基于hash算法来实现,是Hash数据类型的底层存储数据结构。我们来看下redis...

  • Redis数据结构使用场景及优化示例

    Redis 学习路径 基础数据类型和底层数据结构对应关系 一、Hash在什么时候使用压缩列表 Hash 类型底层结...

  • t_hash.c

    Redis的t_hash.c是对hash字典数据结构的实现。主要是基于ziplist、dict、sds实现。 当元...

  • redis笔记

    redis基础知识 数据结构 底层数据结构 SDS 双向链表 压缩列表 跳跃表 Hash表 整数数组 对外数据结构...

  • 哈希表,字典,数组,链表

    1:哈希表 的数据结构,底层实现原理 底层实现:数组 + 链表 哈希表(Hash table,也叫散列表)...

  • Redis - hash底层数据结构实现

    实现 hash数据结构底层实现为一个字典(dict),也是redisDb用来存储k-v的数据结构,当数据量比较小,...

  • Redis 字典

    Redis 字典使用Hash 表作为底层的实现,Hash 表这个结构不难理解,但是在实际应用 Hash 表时,当数...

  • redis常见问题

    1.redis数据结构 redis五种数据结构StringHash 优点由于Hash结构会在单个Hash元素在不足...

  • 使用Redis实现限流

    使用Redis实现限流 原理:使用Redis的Hash数据结构,把对应的key、接口url、限流规则存放进redi...

网友评论

      本文标题:Redis - hash底层数据结构实现

      本文链接:https://www.haomeiwen.com/subject/vsoekltx.html