【Redis】hash数据类型相关指令

目录

hset

设置 hash 中指定的字段(field)的值(value)。

由于Redis本身就是哈希的形式,它自身的键值对称为 key - value,而对于哈希数据类型,也就是 key - value 的 value 是哈希,那么这时称其为 field - value,为了区分开。那么 hset 对于 key 不存在的场景,会自动创建,如果存在,就会向其中添加 field - value,如果 field 存在,就会进行覆盖,该指令返回新增到哈希表中字段的数量。注意这里的hash的 field - value 都只能是字符串,不能像 Redis 的顶层哈希一样能存各种数据结构,可能本身出于轻量化的考虑吧。

hget

获取 hash 中指定字段的值。

key 或 field 不存在就返回 nil。

hexists

判断 hash 中是否有指定的字段。

和 hget 一样,key 或 field 不存在就返回 0。存在就返回 1。和 hget 想必就是不能在存在时获取到 value。

hdel

删除 hash 中指定的字段。

删除的是 field,del 删除的是 key。返回值是本轮操作删除的字段数量。

hkeys

获取 hash 中的所有字段。

hvals

获取 hash 中的所有的值。

hgetall

获取 hash 中的所有字段以及对应的值。

这个指令就是上面两个的合体。这几个指令都不建议冒然使用,原因和 keys *一样,因为都是O(N),如果数据量过大会阻塞线程。

hmget

一次获取 hash 中多个字段的值.

该指令的 O(N) 是将查询的 field 视为 N。

对应的 field 不存在,那么就会返回 nil,如果 key 不存在,那么有几个 field 就返回几个 nil。有 hmget,那么有没有 hmset 呢?其实是有的,但是 hset 本身就能设置多个,所以功能重合了。

hlen

获取 hash 中的所有字段的个数。

key 不存在返回 0。

hsetnx

在字段不存在的情况下,设置 hash 中的字段和值。

如果是存在的 field,那么什么都不会做,如果不存在才会设置。

hincrby

将 hash 中字段对应的数值添加指定的值。

注意 value 得是整形,然后小数的计算也是不行的。这里因为计算这块用的少,也没有提供诸如 hdecrby 的指令,但是我们可以通过加上负数的方式实现减法。

hincrbyfloat

hincrby 的浮点数版本。

hstrlen

返回指定 field 的 value 的长度。

内部编码

ziplist(压缩列表):当哈希类型元素个数小于 hash-max-ziplist-entries 配置(默认 512 个)、同时所有值都小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现,ziplist 使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable 更加优秀。ziplist 的查询效率低于普通哈希,但是因为其只在元素少的情况下使用,所以无伤大雅。

hashtable(哈希表):当哈希类型无法满足 ziplist 的条件时,Redis 会使用 hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,而 hashtable 的读写时间复杂度为 O(1)。

使用场景

Redis 哈希类型最核心的使用场景之一是结构化数据的缓存(如用户信息、商品信息等业务实体数据)。相比于将每个属性拆分为独立字符串键(内存占用高、数据分散),或把整个对象序列化为单个 JSON 字符串(局部更新不灵活、有序列化开销),哈希类型能以 "键(实体 ID)- 字段(属性名)- 值(属性值)" 的形式,直观且高效地缓存结构化数据,既保持了数据的内聚性,又支持对单个属性的精准读写(如仅更新用户年龄、仅获取商品价格),是缓存这类实体数据的最优选择。同时需注意,哈希类型是稀疏结构(不同键可拥有不同字段),更适配灵活的属性存储场景,但无法替代关系型数据库完成复杂的关联查询,仅适用于单实体的属性缓存与操作。

相关推荐
冉冰学姐2 小时前
SSM在线影评网站平台82ap4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm框架·在线影评平台·影片分类
知识分享小能手3 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019数据库的操作(2)
数据库·学习·sqlserver
踩坑小念4 小时前
秒杀场景下如何处理redis扣除状态不一致问题
数据库·redis·分布式·缓存·秒杀
萧曵 丶5 小时前
MySQL 语句书写顺序与执行顺序对比速记表
数据库·mysql
Wiktok5 小时前
MySQL的常用数据类型
数据库·mysql
曹牧6 小时前
Oracle 表闪回(Flashback Table)
数据库·oracle
J_liaty6 小时前
Redis 超详细入门教程:从零基础到实战精通
数据库·redis·缓存
m0_706653236 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
山岚的运维笔记6 小时前
SQL Server笔记 -- 第15章:INSERT INTO
java·数据库·笔记·sql·microsoft·sqlserver