5

redis学习之九哈希对象

 3 years ago
source link: https://segmentfault.com/a/1190000040739910
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

redis学习之九哈希对象

发布于 9 月 26 日

之前相关联的文章:
redis学习之一SDS
redis学习之二双端链表
redis学习之三字典
redis学习之四skiplist
redis学习之五ziplist
redis学习之六对象
redis学习之七字符串对象
redis学习之八列表对象

说明:本文是基于redis2.9版本

先再看一下redisObject的定义:

typedef struct redisObject{
    //类型
    unsigned type:4;
    //编码
    unsigned encoding:4;
    //lru缓存淘汰机制信息
    unsigned lru:LRU_BITS;
    //引用计数器
    int refcount;
    //指向底层实现数据结构的指针
    void *ptr;
}robj;

哈希对象的编码可以是ziplist或hashtable。当同时满足下面两个条件时使用ziplist编码,不满足时则使用hashtable。

  1. 保存的键和值的字符串长度都小于64字节。
  2. 保存的键值对数量小于512个。

上面两个条件可以通过hash-max-ziplist-value和hash-ziplist-entries两个值进行调整。

当使用ziplist编码时有下面两个特点:

  1. 健值对作为两个节点是紧挨在一起的,健节点在前值节点紧随其后。
  2. 健节点放在ziplist表头方向,值节点放在ziplist表尾方向。

看下执行了下面命令后:

redis> HSET profile Name "Tom"
(integer) 1

redis> HSET profile Age 18
(integer) 1

存储如下图:
image.png

当使用hashtable编码时有下面两特点:

  1. hashtable里的每个键都是一个stringObject对象,对象里保存了键的内容。
  2. hashtable里的每个值都是一个stringObject对象,对象里保存了值的内容。

上面执行的命令如果使用的是hashtable,则存储如下:
image.png
(存储的格式是上面展示的,忽略里面具体的内容。。。)

参考的文章有:
黄健宏的《Redis设计与实现》一书


Recommend

  • 38
    • huyan.couplecoders.tech 5 years ago
    • Cache

    Redis系列(十)redis对象系统

    前言 其实关于本文,我犹豫再三。 对象系统值得写一篇文章吗?从技术上来讲,当然是值。但是对于我们大部分人来说,它都是隐身的。 写的话,顺序放在哪里?在 Redis 系列(九)底层数据结构...

  • 36
    • 微信 mp.weixin.qq.com 4 years ago
    • Cache

    Redis对象

    Redis对象 原创...

  • 18
    • www.cnblogs.com 4 years ago
    • Cache

    redis源码学习之slowlog

    目录 背景 redis虽说是一个基于内存的KV数据库,以高性能著称,但是依然存在一些耗时比较高的命令,比如keys...

  • 17

    哈希对象的编码有两种: ziplist 、 hashtable 。 编码一:ziplist ziplist 已经是我们的老朋友了,它一出现,那肯定就是为了节省内存啦。那么哈希对象是怎么用 zip...

  • 10

    dotnet 性能优化 利用哈希思想优化大对象集合相等判断性能利用哈希的其中一个思想,相同的对象的哈希值相同,可以用来提升一些大对象集合的进行对象相等判断的性能。大对象的相等判断指的是有某些类型的相等判断需要用到对象的很多属性或字段进行参与判断...

  • 5
    • lichuanyang.top 3 years ago
    • Cache

    redis的对象

    redis的对象 发表于 2020-08-08...

  • 9
    • cbsheng.github.io 2 years ago
    • Cache

    Redis(5.0.3)源码分析之sds对象

    Redis(5.0.3)源码分析之sds对象 sds是redis中定义字符串对象,它比C中的字符串类型对象更为高效、安全。 sds额外保存了字符串长度和内存分配大小等信息。获取长度就只用O(1)。 sds对象中可能会包含多余空间...

  • 5
    • jingsam.github.io 2 years ago
    • Cache

    Git内部原理之Git对象哈希

    在上一篇文章中,将了数据对象、树对象和提交对象三种Git对象,每种对象会计算出一个hash值。那么,Git是如何计算出Git对象的hash值?本文的内容就是来解答这个问题。

  • 4

    Redis 哈希Hash底层数据结构 1. Redis 底层数据结构

  • 3

    Redis为什么使用哈希槽而不用一致性哈希 作者:小许code 2023-12-20 08:11:02 Redis节点间通信时,心跳包会携带节点的所有槽信息,它能以幂等方式来更新配置。如果采用 16384 个插槽,占空间 2KB (16384/8);如果...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK