redis哈希对象的底层编码有两种:ziplist、hashtable

ziplist编码

当一个哈希键只包含少量kv对、且key和value都是小整数值、短字符串时,redis会使用压缩列表来做

ziplist编码之前介绍过,最初是用在列表对象中的一种编码,在简单的哈希对象中也会用到。有遗忘时参考这里:https://www.cnblogs.com/loveCheery/p/9152144.html

在哈希对象中,采用ziplist编码时:

  • 先向压缩列表中放key、再放value
  • 先添加的对象放在表头,后添加的对象在尾部追加

比如:

127.0.0.1:> hset profile name "Tom"
(integer)
127.0.0.1:> hset profile age
(integer)
127.0.0.1:> hset profile career "Programmer"
(integer)
127.0.0.1:> object encoding profile
"ziplist"

其压缩列表的内部结果如:

hashtable编码

hashtable编码采用字典作为底层实现。底层与1.8之前的jdk中map很相似,为链表数组,但是有自己的rehash条件、扩容收缩规则。

比如我们在上面的profile中插入一项较长字符串的vaule,其编码会转变为hashtable

127.0.0.1:> hset profile evaluation "So far as I know, Tom is a very kind boy, the boy u can trust. You can let him to do some tasks with high priority."
(integer)
127.0.0.1:> object encoding profile
"hashtable"

内部结构类似于:

hashtable底层字典的插入、查询、对字典有遗忘看这里:https://www.cnblogs.com/loveCheery/p/9133674.html

编码转换

当对象同时满足这两个条件时,使用ziplist编码:

  1. 所有key和value的字符串长度都小于64字节(可使用hash-max-ziplist-value配置)
  2. key-value对数量小于512个(可使用hash-max-ziplist-entries配置)

不满足这两个条件时,转为hashtable编码。

还没验证是否会从hashtable转回ziplist

redis_哈希对象的更多相关文章

  1. 实习小记-python中不可哈希对象设置为可哈希对象

    在这篇之前,我又专门翻译过官方python3.3的可哈希对象文档,大家可以先参考一下: 实习小记-python中可哈希对象是个啥?what is hashable object in python? ...

  2. redis 系列12 哈希对象

    一. 哈希对象概述 Redis hash对象是一个string类型的field和value的映射表,hash特别适合用于存储对象.作为哈希对象的编码,有二种一是ziplist编码, 二是hashtab ...

  3. 15天玩转redis —— 第四篇 哈希对象类型

    redis中的hash也是我们使用中的高频数据结构,它的构造基本上和编程语言中的HashTable,Dictionary大同小异,如果大家往后有什么逻辑需要用 Dictionary存放的话,可以根据场 ...

  4. redis -hash(哈希.对象)

    hash 用于储存对象,对象的结构为属性.值 值的类型string 增加.修改: 设置单个属性: hset 键 field 值 例如: 设置键 user 的属性name 为 python hset u ...

  5. redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系

    一.概述 在前面章节中,主要了解了 Redis用到的主要数据结构,包括:简单动态字符串.链表(双端链表).字典.跳跃表. 整数集合.压缩列表(后面再了解).Redis没有直接使用这些数据结构来实现键值 ...

  6. ruby 对象转换哈希(Hash)

    通过 ActiveRecord 从数据库的某张数据表(table)中获取的对象如何转换成为 Hash orders_table 是一张订单信息表,对应的 model 为 Orders @order = ...

  7. Redis对象——哈希(Hash)

    哈希在很多编程语言中都有着很广泛的应用,而在Redis中也是如此,在redis中,哈希类型是指Redis键值对中的值本身又是一个键值对结构,形如value=[{field1,value1},...{f ...

  8. Redis学习笔记一:数据结构与对象

    1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...

  9. 实习小记-python中可哈希对象是个啥?what is hashable object in python?

    废话不多说直接祭上python3.3x的文档:(原文链接) object.__hash__(self) Called by built-in function hash() and for opera ...

随机推荐

  1. jmeter学习笔记--概述

    jmeter:概述 是什么? jmeter是Apache 公司使用java开发的一款测试工具 为什么? 高效.功能强大 模拟一些高并发或多次循环等特殊场景 怎么用? 1.下载jmeter,解压缩 2. ...

  2. Selenium+TestNG+Maven(2)

    转载自http://www.cnblogs.com/hustar0102/p/5885115.html selenium介绍和环境搭建 一.简单介绍 1.selenium:Selenium是一个用于W ...

  3. day50 盒子显隐2D形变

    复习 1.浮动布局 解决block盒子同行显示 => 不完全脱离文档流 => 不再撑开父级高度 脱离文档流: 不在页面中占位(显示层次高于文档流) 不完全: 可以通过清浮动操作, 让子级重 ...

  4. pandas,读取或存储DataFrames的数据到mysql中

    dataFrames格式的数据是表格形式的,mysql数据库中的数据也是表格形式的,二者可以很方便的读取存储   安装依赖的包 pip install pandas pip install sqlal ...

  5. Laravel 5 速查表

    Artisan // 在版本 5.1.11 新添加,见 http://d.laravel-china.org/docs/5.1/authorization#creating-policiesphp a ...

  6. ASP.Net的工作线程与请求队列

    当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程. 一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理其他请求.如果一个同步请求成为 I/O bo ...

  7. Rendering Problems Couldn't resolve resource @dimen/y20

    (转)文章转自 songzi1228 的 https://blog.csdn.net/songzi1228/article/details/80255058  本人亲自试用,妥妥的解决了我的问题. R ...

  8. maven学习--1.项目结构及简单使用

    1.项目目录结构 MavenProjectRoot(项目根目录)   |----src   |     |----main   |     |         |----java ——存放项目的.ja ...

  9. Swoole 网络通信协议,固定包头。

    网络通信过程中,可能会出现分包和合包的情况.具体情况如https://wiki.swoole.com/wiki/page/484.html文档所讲的.这里测试了下固定包头的协议.示例代码如下 1.解包 ...

  10. python 打包成 windows .EXE

    1. 升级pip python -m pip install --upgrade pip 2.安装 pyinstall (打包程序) pip install pyinstaller 3 开始打包(打包 ...