【Redis】 关于 Redis 哈希类型

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 【Redis】 关于 Redis 哈希类型

🍃前言

⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。

在 Redis 中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如

key = "key",value = { { field1, value1 }, ..., {fieldN, valueN } }

Redis 键值对和哈希类型⼆者的关系可以下图表示:

哈希类型中的映射关系通常称为 field-value,⽤于区分 Redis 整体的键值对(key-value),注意这⾥的 value 是指field 对应的值,不是键(key)对应的值,请注意 value 在不同上下⽂的作⽤

下面我将从以下三个方面对哈希类型进行介绍:

  1. 哈希类型常用命令
  2. 哈希类型的内部编码
  3. 哈希类型的使用场景

🎋命令介绍

🚩hset

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

语法如下:

hset key field value [field value ...]

时间复杂度:

  • 插⼊⼀组 field 为 O(1), 插⼊ N 组 field 为 O(N)

返回值:

  • 添加的字段的个数

🚩hget

获取hash中指定字段的值

语法:

hget key field

时间复杂度:

  • O(1)

返回值:

  • 字段对应的值或者 nil

🚩hexists

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

语法:

hexists key field

时间复杂度:

  • O(1)

返回值:

  • 1 表⽰存在,0 表⽰不存在。

🚩hdel

删除 hash 中指定的字段

语法:

hdel key field [field ...]

时间复杂度:

  • 删除⼀个元素为 O(1). 删除 N 个元素为 O(N).

返回值:

  • 本次操作删除的字段个数

🚩hkeys

获取 hash 所有字段

语法:

hkeys key

时间复杂度:

  • O(N), N 为 field 的个数.

返回值:

  • 字段列表。

🚩hvals

获取 hash 中的所有的值

语法:

hvals key

时间复杂度:

  • O(N),N 为 field 的个数.

返回值:

  • 所有的值

🚩hgetall

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

语法:

hgetall key

时间复杂度:

  • O(N), N 为 field 的个数.

返回值:

  • 字段和对应的值。

🚩hmget

⼀次获取 hash 中多个字段的值

语法:

hmget key field [field ...]

时间复杂度:

  • 只查询⼀个元素为 O(1), 查询多个元素为 O(N), N 为查询元素个数.

返回值:

  • 字段对应的值或者nil。

🚩hlen

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

语法:

hlen key

🚩hsetnx

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

语法:

hsetnx key field value

时间复杂度:

  • O(1)

返回值:

  • 1表⽰设置成功,0表⽰失败。

🚩hincrby

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

语法:

hincrby key field increment

时间复杂度:

  • O(1)

返回值:

  • 该字段变化之后的值

🚩hincrbyfloat

hincrby的浮点数版本

语法:

hincrbyfloat key field increment

时间复杂度:

  • O(1)

返回值:

  • 该字段变化之后的值

🌳命令小结

命令 执⾏效果 时间复杂度
hset key field value 设置值 O(1)
hget key field 获取值 O(1)
hdel key field [field …] 删除 field O(k), k 是 field个数
hlen key 计算 field 个数 O(1)
hgetall key 获取所有的 field-value O(k), k 是 field个数
hmget field [field …] 批量获取 field-value O(k),k是field个数
hmset field value [field value…] 批量获取 field-value O(k), 个数 k 是 field
hexists key field 判断 field 是否存在 O(1)
hkeys key 获取所有的 field O(k), k 是 field个数
hvals key 获取所有的 value O(k), k 是 field个数
hsetnx key field value 设置值,但必须在 field 不存在时才能设置成功 O(1)
hincrby key field n 对应field-value +n O(1)
hincrbyfloat key field n 对应 field-value +n O(1)
hstrlen key field 计算 value 的字符串⻓度 O(1)

🌲内部编码

哈希的内部编码有两种:

  • ziplist(压缩列表):当哈希类型元素个数⼩于 hash-max-ziplist-entries 配置(默认 512 个)、同时所有值都⼩于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使⽤ ziplist 作为哈希的内部实现,ziplist 使⽤更加紧凑的结构实现多个元素的连续存储,所以在节省内存⽅⾯⽐ hashtable更加优秀。
  • hashtable(哈希表):当哈希类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,⽽hashtable 的读写时间复杂度为O(1)。

🎍使用场景

🚩做为缓存

比如我们有一个关系型数据表记录的两条⽤⼾信息,⽤⼾的属性表现为表的列,每条⽤⼾信息表现为⾏。我们如何映射这两条用户的信息呢?

映射关系如下:

相⽐于使⽤ JSON 格式的字符串缓存⽤⼾信息,哈希类型变得更加直观,并且在更新操作上变得更灵活。可以将每个⽤⼾的 id 定义为键后缀,多对field-value对应⽤⼾的各个属性。

那么有些人就说了,既然 redis 可以通过这些方式表示关系表,那么是不是就可以直接用 Redis 哈希来表示关系型数据库了呢?

需要注意的是哈希类型和关系型数据库有两点不同之处:

  • 哈希类型是稀疏的,⽽关系型数据库是完全结构化的,例如哈希类型每个键可以有不同的 field,⽽关系型数据库⼀旦添加新的列,所有⾏都要为其设置值,即使为 null。
  • 关系数据库可以做复杂的关系查询,⽽ Redis 去模拟关系型复杂查询,例如联表查询、聚合查询等基本不可能,维护成本⾼

⭕总结

关于《【Redis】 哈希类型》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
2月前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
3月前
|
存储 NoSQL Redis
Redis 哈希(Hash)
10月更文挑战第16天
65 1
|
3月前
|
消息中间件 存储 监控
redis 的List类型 实现 排行榜
【10月更文挑战第8天】
58 2
|
3月前
|
存储 NoSQL Redis
redis-set类型
【10月更文挑战第6天】
64 1
|
3月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
39 3
|
3月前
|
消息中间件 分布式计算 NoSQL
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
41 2
|
2月前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
4月前
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
66 2
|
3月前
|
消息中间件 NoSQL Kafka
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
266 0