redis学习笔记(三)—— hash数据类型

前言

在 redis 中,本身就是使用 key-value 哈希表结构来存储数据;

key 是stirng类型,而 value也可以是 hash 类型;

这里 value 哈希类型中的映射关系通常称为 field-value(和reis中的 key-value 区分);而 value 指的是 field 对应的值

常用命令

HSET

复制代码
hset key field value [field value]

设置 hash表中指定的字段的值(设置hash中键值对 field-value);可以一次设置多组键值对(field-value)

返回值:添加键值对的个数

这里 hset命名可以一次设置多组键值对,和 hmset 命令功能一样

HSETNX

复制代码
hsetnx key field value

当字段不存在时,再进行设置 hash 表中的字段和值

返回值:1 表示设置成功,0 表示设置失败

HGET

复制代码
hget key field

获取 hash 表中指定字段对应的值

返回值:返回对应的value或者nil

HMGET

复制代码
hmget key field [field]

获取 hash 表中指定字段 field 对应的值 value(可以一次获取多个value

HEXISTS

复制代码
hexists key field

判断 hash 表中指定字段 field 是否存在

返回值:1 表示存在,0 表示不存在

如果key都不存在,那field肯定也不存在,返回值就是 0

HDEL

复制代码
hdel key field [field]

删除 hash 表中的指定字段

返回值:成功删除的字段的个数

注意:hdel 是删除 key 对应 value 的hash表中的字段,del命令 是删除 key

HKEYS

复制代码
hkeys key

获取 hash 表中的所有字段

hkeys 获取 key 对应 value 的hash表中的所有 field,keys命令是获取所有的 key

HVALS

复制代码
hvals key

获取 hash 表中所有的值(获取 hash 表中的 所有 value

HGETALL

复制代码
hgetall key

获取 hash 表中所有的键值对(field-value)

HLEN

复制代码
hlen key

获取 hash 表中的键值对个数

内部编码

ziplist

ziplist(压缩列表)是Redis为了节省内存而设计的一种紧凑的连续存储结构,并非专门为哈希类型设计,但因其高效的内存利用率,被选为哈希类型在特定条件下的内部实现。

当哈希类型满足以下两个条件时,Redis会优先使用ziplist作为内部实现:

  1. 哈希中的元素个数小于 hash-max-ziplist-entries 配置值(默认值为512个);
  2. 哈希中所有元素的值的长度都小于 hash-max-ziplist-value 配置值(默认值为64字节)。

hashtable

hashtable(哈希表)是Redis中另一种核心的内部实现,我们熟悉的字符串类型(当值较大时)、集合类型等也会用到它。对于哈希类型而言,当无法满足上述ziplist的两个条件时,Redis会自动将内部实现切换为hashtable。

ziplist虽然节省内存,但它的结构决定了其读写效率会随着元素数量和值长度的增加而下降:当元素增多、值变大时,ziplist的插入、删除、查找操作需要频繁地移动内存中的数据,时间复杂度会逐渐升高。

而hashtable的优势恰恰在于高效的读写性能------它通过哈希函数将元素映射到不同的桶中,无论是插入、删除还是查找操作,平均时间复杂度都能稳定在O(1)。当哈希中的元素数量较多(超过512个),或者存在值长度较大(超过64字节)的元素时,hashtable能够保证读写操作的高效性,避免因ziplist的性能瓶颈影响整体服务效率。

相关推荐
焗猪扒饭15 小时前
redis stream用作消息队列极速入门
redis·后端·go
齐生11 天前
iOS 知识点 - IAP 是怎样的?
笔记
tingshuo29172 天前
D006 【模板】并查集
笔记
tingshuo29173 天前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
雨中飘荡的记忆3 天前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
曲幽3 天前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio
西岸行者8 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
starlaky8 天前
Django入门笔记
笔记·django
勇气要爆发8 天前
吴恩达《LangChain LLM 应用开发精读笔记》1-Introduction_介绍
笔记·langchain·吴恩达
悠哉悠哉愿意8 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习