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的性能瓶颈影响整体服务效率。

相关推荐
学编程的闹钟1 小时前
C语言WSAGetLastError函数
c语言·开发语言·学习
Coisinilove2 小时前
MATLAB学习笔记——第一章
笔记·学习·matlab
努力学习的小廉2 小时前
redis学习笔记(四)—— list数据类型
redis·笔记·学习
Amazing_Cacao2 小时前
工艺师体系回顾|从参数到系统的能力跃迁(精品可可,精品巧克力)
学习
im_AMBER2 小时前
Leetcode 118 从中序与后序遍历序列构造二叉树 | 二叉树的最大深度
数据结构·学习·算法·leetcode
jay神2 小时前
基于SpringBoot的英语自主学习系统
java·spring boot·后端·学习·毕业设计
CappuccinoRose2 小时前
HTML语法学习文档(一)
前端·学习·html
承渊政道2 小时前
C++学习之旅【C++继承概念指南与核心内容介绍】
c语言·开发语言·c++·笔记·学习·visual studio
GeminiJM2 小时前
LangGraph 源码学习笔记
linux·笔记·学习·langchain