redis_哈希对象
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编码:
- 所有key和value的字符串长度都小于64字节(可使用hash-max-ziplist-value配置)
- key-value对数量小于512个(可使用hash-max-ziplist-entries配置)
不满足这两个条件时,转为hashtable编码。
还没验证是否会从hashtable转回ziplist
redis_哈希对象的更多相关文章
- 实习小记-python中不可哈希对象设置为可哈希对象
在这篇之前,我又专门翻译过官方python3.3的可哈希对象文档,大家可以先参考一下: 实习小记-python中可哈希对象是个啥?what is hashable object in python? ...
- redis 系列12 哈希对象
一. 哈希对象概述 Redis hash对象是一个string类型的field和value的映射表,hash特别适合用于存储对象.作为哈希对象的编码,有二种一是ziplist编码, 二是hashtab ...
- 15天玩转redis —— 第四篇 哈希对象类型
redis中的hash也是我们使用中的高频数据结构,它的构造基本上和编程语言中的HashTable,Dictionary大同小异,如果大家往后有什么逻辑需要用 Dictionary存放的话,可以根据场 ...
- redis -hash(哈希.对象)
hash 用于储存对象,对象的结构为属性.值 值的类型string 增加.修改: 设置单个属性: hset 键 field 值 例如: 设置键 user 的属性name 为 python hset u ...
- redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系
一.概述 在前面章节中,主要了解了 Redis用到的主要数据结构,包括:简单动态字符串.链表(双端链表).字典.跳跃表. 整数集合.压缩列表(后面再了解).Redis没有直接使用这些数据结构来实现键值 ...
- ruby 对象转换哈希(Hash)
通过 ActiveRecord 从数据库的某张数据表(table)中获取的对象如何转换成为 Hash orders_table 是一张订单信息表,对应的 model 为 Orders @order = ...
- Redis对象——哈希(Hash)
哈希在很多编程语言中都有着很广泛的应用,而在Redis中也是如此,在redis中,哈希类型是指Redis键值对中的值本身又是一个键值对结构,形如value=[{field1,value1},...{f ...
- Redis学习笔记一:数据结构与对象
1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...
- 实习小记-python中可哈希对象是个啥?what is hashable object in python?
废话不多说直接祭上python3.3x的文档:(原文链接) object.__hash__(self) Called by built-in function hash() and for opera ...
随机推荐
- JS创建一个数组1.求和 2.求平均值 3.最大值 4.最小值 5.数组逆序 6.数组去重 0.退出
rs = require("readline-sync"); let arr = []; console.log("请输入数组的长度:"); let arr_l ...
- python中re正则表达式
1.re匹配的语法 re.math 从头开始匹配,没有匹配到返回None re.seach 匹配包含,,没有匹配到返回None re.findall 把所有匹配到的字符,以列表的形式返回,没有匹配到返 ...
- Python复杂场景下字符串处理相关问题与解决技巧
1.如何拆分含有多种分隔符的字符串¶ ''' 实际案例: 我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如: s=’ab;cd|efg|hi,jkl|mn\topq ...
- java第一章抽象和封装
面向过程和面向对象有什么区别? 面向过程的核心是函数,以功能为中心,实现了函数级别的代码重用. 面向对象的核心是封装了属性和方法(行为)的类,以数据为中心,实现了类级别的代码重用. 面向对象因为采用了 ...
- P3865 【模板】ST表
P3865 [模板]ST表 https://www.luogu.org/problemnew/show/P3865 题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数 ...
- UEFI EVENT 全解
Event和Timer在UEFI当中是怎么实现的以及原理,我们先从Timer开始,然后细细的拨开隐藏在底层的实现. 先说Timer,那什么是Timer呢?其实在中文里面我们把它叫做定时/计数器,但是我 ...
- python基础 ------ 集合
---恢复内容开始--- ----- 集合 使用场景:网购的订单.与商品ID 一一对应的商品信息 python的内置类型:List Tuple Dictionary ---- 列表 LI ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- 制作docker基础镜像
docker build -t tomcat:jre8-alpine . sudo docker tag 5a3 registry.cn-shenzhen.aliyuncs.com/ibase/tom ...
- mkfs.ext4快速格式化大容量硬盘
安装ext4: yum -y install e4fsprogs 使用如下命令可以快速格式化大容量硬盘: mkfs.ext4 -T largefile /dev/xxx