Redis中的Hash哈希

哈希这个类型几乎被所有主流的编程语言包含,它们的叫法可能是哈希、字典、关联数组、映射。在Redis中,哈希类型是指本身又是一个键值对结构,形如key="key",value={{field1,value1},...,{fieldn,valuen}},redis键值对和哈希类型二者的关系入下图:

注意:

哈希类型中的映射关系通常称为field-value,这主要是为了区分Redis整体的键值对(key-value)。

命令

HSET

语法:

shell 复制代码
HSET key field value [field value ...]

功能:设置hash中的字段和值

命令有效版本:2.0.0以后

时间复杂度:O(K) K为插入的组数。

返回值:添加的字段的个数。

演示:

shell 复制代码
127.0.0.1:6379> hset key field1 value1
(integer) 1
127.0.0.1:6379> hset key2 field1 value1 field2 value2
(integer) 2
127.0.0.1:6379> hget key field1
"value1"
127.0.0.1:6379> 

HGET

语法:

shell 复制代码
HGET key field

功能:获取hash中指定字段的值。

命令有效版本:2.0.0以后

时间复杂度:O(1)

返回值:字段对应的值或者nil

演示:

shell 复制代码
127.0.0.1:6379> hset key field1 value1
(integer) 1
127.0.0.1:6379> hset key2 field1 value1 field2 value2
(integer) 2
127.0.0.1:6379> hget key field1
"value1"
127.0.0.1:6379> hget key field3
(nil)
127.0.0.1:6379> 

HEXISTS

语法:

shell 复制代码
HEXISTS key fields

功能:判断hash中指定的字段是否存在。

命令有效版本:2.0.0以后

时间复杂度:O(1)

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

演示:

shell 复制代码
127.0.0.1:6379> hset key field value
(integer) 1
127.0.0.1:6379> hexists key field
(integer) 1
127.0.0.1:6379> hexists key field2
(integer) 0
127.0.0.1:6379> 

HDEL

语法:

shell 复制代码
HDEL key field [field ...]

功能:删除hash中指定的字段

命令有效版本:2.0.0以后

时间复杂度:O(K),K为删除的字段数目。

返回值:本次删除的字段个数。

演示:

shell 复制代码
127.0.0.1:6379> hset key field value 
(integer) 1
127.0.0.1:6379> hset key field2 value2 
(integer) 1
127.0.0.1:6379> hset key field3 value3 
(integer) 1
127.0.0.1:6379> hdel key field
(integer) 1
127.0.0.1:6379> hdel key field2 field3
(integer) 2
127.0.0.1:6379> hdel key field
(integer) 0
127.0.0.1:6379> 

HKEYS

语法:

shell 复制代码
HKEYS key

功能:获取hash中的所有字段。

命令有效版本:2.0.0以后

时间复杂度:O(N)

返回值:字段列表

演示:

shell 复制代码
127.0.0.1:6379> hset key field1 value1 field2 value2 field3 value3
(integer) 3
127.0.0.1:6379> hkeys key
1) "field1"
2) "field2"
3) "field3"
127.0.0.1:6379> 

HVALS

语法:

shell 复制代码
HVALS key

功能:获取hash中的所有值

命令有效版本:2.0.0以后

时间复杂度:O(N)

返回值:所有值

演示:

shell 复制代码
127.0.0.1:6379> hset key field1 value1 field2 value2 field3 value3
(integer) 3
127.0.0.1:6379> hvals key
1) "value1"
2) "value2"
3) "value3"
127.0.0.1:6379> 

HGETALL

语法:

shell 复制代码
HGETALL key

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

命令有效版本:2.0.0以后

时间复杂度:O(N)

返回值:所有的字段和值

演示:

shell 复制代码
127.0.0.1:6379> hset key field1 value1 field2 value2 field3 value3
(integer) 3
127.0.0.1:6379> hgetall key
1) "field1"
2) "value1"
3) "field2"
4) "value2"
5) "field3"
6) "value3"
127.0.0.1:6379> 

HMGET

语法:

shell 复制代码
HMGET key field [field ...]

功能:一次性获取hash中的多个字段的值

命令有效版本:2.0.0以后

时间复杂度:O(K),K为查询的字段个数

返回值:字段对应的值或者nil

演示:

shell 复制代码
127.0.0.1:6379> hset key field1 value1 field2 value2 field3 value3
(integer) 3
127.0.0.1:6379> hmget key field1 field2
2) "value1"
3) "value2"
127.0.0.1:6379> 

HLEN

语法:

shell 复制代码
HLEN key

功能:获取hash中所有字段的个数

命令有效版本:2.0.0以后

时间复杂度:O(1)

返回值:字段个数

演示:

shell 复制代码
127.0.0.1:6379> hset key field1 value1 field2 value2 field3 value3
(integer) 3
127.0.0.1:6379> hlen key
(integer) 3
127.0.0.1:6379> 

HSETNX

语法:

shell 复制代码
HSETNX key field value

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

命令有效版本:2.0.0以后

时间复杂度:O(1)

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

演示:

shell 复制代码
127.0.0.1:6379> hsetnx key field value
(integer) 1
127.0.0.1:6379> hsetnx key field value1
(integer) 0
127.0.0.1:6379> hget key field
"value"
127.0.0.1:6379> 

HINCRBY

语法:

shell 复制代码
HINCRBY key field increment

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

命令有效版本:2.0.0以后

时间复杂度:O(1)

返回值:该字段变化之后的值。

演示:

shell 复制代码
127.0.0.1:6379> hset key field 114514
(integer) 1
127.0.0.1:6379> hincrby key field -114514
(integer) 0
127.0.0.1:6379> hincrby key field 999
(integer) 999
127.0.0.1:6379> hget key field
"999"
127.0.0.1:6379> 

HINCRBYFLOAT

语法:

shell 复制代码
HINCRBYFLOAT key field increment

功能:将hash中的字段对应的数值添加指定的值,数值可为浮点数。

命令有效版本:2.6.0以后

时间复杂度:O(1)

返回值:该字段变化之后的值。

演示:

shell 复制代码
127.0.0.1:6379> hset key field 9.9
(integer) 1
127.0.0.1:6379> hincrbyfloat key field 9.9
"19.8"
127.0.0.1:6379> hget key field
"19.8"
127.0.0.1:6379> 

内部编码

哈希的内部编码有两种:

  • ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。

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

注意: Redis 7.0 版本中引入了新数据结构,完全替代了 ziplist ,成为默认的紧凑编码格式。结构为:listpack

相关推荐
IvorySQL8 小时前
PostgreSQL 日报 | JOIN 与外键优化(8 月 9 日)
数据库·postgresql
ltl8 小时前
自治数据库十年回顾:Peloton、NoisePage、OtterTune 到云原生 auto-tuning
数据库
灯澜忆梦10 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
爱跳舞的烤冷面10 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
C++ 老炮儿的技术栈11 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
MC皮蛋侠客12 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis
zt1985q13 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
IvorySQL14 小时前
PostgreSQL 日报| PostgreSQL 19 默认 WAL 压缩算法(8 月 8 日)
数据库·postgresql·区块链
油丶酸萝卜别吃14 小时前
MySQL B+ 树查询全过程详解
数据库·mysql
leisoo809714 小时前
股票数据本地化存储实战:JSON、数据库与列式存储的方案对比
jvm·数据库·json