详解Redis的Hash类型及相关命令

目录

HSET

HGET

HEXISTS

HDEL

HKEYS

HVALS

HGETALL

HMGET

HLEN

HSETNX

HINCRBY

HINCRBYFLOAT

内部编码

应用场景


HSET

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

语法

HSET key field value [field value ...]

时间复杂度:插⼊⼀组 field 为 O(1), 插⼊ N 组 field 为 O(N)

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

举例

复制代码
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HGET myhash field1
"Hello"
redis> HSET myhash field2 "Hi" field3 "World"
(integer) 2
redis> HGET myhash field2
"Hi"
redis> HGET myhash field3
"World"
redis> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "Hi"
5) "field3"
6) "World"
HGET

获取 hash 中指定字段的值。

语法

HGET key field

时间复杂度:O(1)

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

举例

复制代码
redis> HSET myhash field1 "foo"
(integer) 1
redis> HGET myhash field1
"foo"
redis> HGET myhash field2
(nil)
HEXISTS

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

语法

HEXISTS key field

时间复杂度:O(1)

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

举例

复制代码
redis> HSET myhash field1 "foo"
(integer) 1
redis> HEXISTS myhash field1
(integer) 1
redis> HEXISTS myhash field2
(integer) 0
HDEL

删除 hash 中指定的字段。

语法

HDEL key field [field ...]

时间复杂度:删除⼀个元素为 O(1). 删除 N 个元素为 O(N).

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

举例

复制代码
redis> HSET myhash field1 "foo"
(integer) 1
redis> HDEL myhash field1
(integer) 1
redis> HDEL myhash field2
(integer) 0
HKEYS

获取 hash 中的所有字段。

语法

HKEYS key

时间复杂度:O(N), N 为 field 的个数.

返回值:字段列表。

举例

复制代码
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HKEYS myhash
1) "field1"
2) "field2"
HVALS

获取 hash 中的所有的值。

语法

HVALS key

时间复杂度:O(N), N 为 field 的个数.

返回值:所有的值。

举例

复制代码
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HVALS myhash
1) "Hello"
2) "World"
HGETALL

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

语法

HGETALL key

时间复杂度:O(N), N 为 field 的个数.

返回值:字段和对应的值。

举例

复制代码
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "World"
HMGET

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

语法

HMGET key field [field ...]

时间复杂度:只查询⼀个元素为 O(1), 查询多个元素为 O(N), N 为查询元素个数.

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

举例

复制代码
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HMGET myhash field1 field2 nofield
1) "Hello"
2) "World"
3) (nil)
HLEN

获取 hash 中的所有字段的个数。
语法
HLEN key
时间复杂度:O(1)
返回值:字段个数。
举例

复制代码
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HLEN myhash
(integer) 2
HSETNX

在字段不存在的情况下,设置 hash 中的字段和值。
语法
HSETNX key field value
时间复杂度:O(1)
返回值:1 表⽰设置成功,0 表⽰失败。
举例

复制代码
redis> HSETNX myhash field "Hello"
(integer) 1
redis> HSETNX myhash field "World"
(integer) 0
redis> HGET myhash field
"Hello"
HINCRBY

将 hash 中字段对应的数值添加指定的值。
语法
HINCRBY key field increment
时间复杂度:O(1)
返回值:该字段变化之后的值。
举例

复制代码
redis> HSET myhash field 5
(integer) 1
redis> HINCRBY myhash field 1
(integer) 6
redis> HINCRBY myhash field -1
(integer) 5
redis> HINCRBY myhash field -10
(integer) -5
HINCRBYFLOAT

HINCRBY 的浮点数版本。
语法
HINCRBYFLOAT key field increment
时间复杂度:O(1)
返回值:该字段变化之后的值。
举例

复制代码
redis> HSET mykey field 10.50
(integer) 1
redis> HINCRBYFLOAT mykey field 0.1
"10.6"
redis> HINCRBYFLOAT mykey field -5
"5.6"
redis> HSET mykey field 5.0e3
(integer) 0
redis> HINCRBYFLOAT mykey field 2.0e2
"5200"
内部编码

哈希的内部编码有两种:

ziplist(压缩列表):当哈希类型元素个数⼩于 hash-max-ziplist-entries 配置(默认 512 个)、同时所有值都⼩于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使⽤ ziplist 作为哈希的内部实现,ziplist 使⽤更加紧凑的结构实现多个元素的连续存储,所以在节省内存⽅⾯⽐hashtable 更加优秀。
hashtable(哈希表):当哈希类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,⽽ hashtable 的读写时间复杂度为 O(1)。
下⾯的⽰例演⽰了哈希类型的内部编码,以及响应的变化。
1)当 field 个数⽐较少且没有⼤的 value 时,内部编码为 ziplist:
127.0.0.1:6379> hmset hashkey f1 v1 f2 v2
OK
127.0.0.1:6379> object encoding hashkey
"ziplist"
2)当有 value ⼤于 64 字节时,内部编码会转换为 hashtable:
127.0.0.1:6379> hset hashkey f3 "one string is bigger than 64 bytes ... 省略 ..."
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"
3)当 field 个数超过 512 时,内部编码也会转换为 hashtable:
127.0.0.1:6379> hmset hashkey f1 v1 h2 v2 f3 v3 ... 省略 ... f513 v513
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"

应用场景

1.缓存数据

类似于String类型,Hash类型也可以用于缓存数据。不过,由于Hash类型可以存储多个字段和字段值,因此更适合用于缓存具有多个属性的数据。
例如,可以将经常访问的商品信息、用户信息等缓存在Hash类型中,以便快速读取和响应客户端请求。
2.对象属性存储
Hash类型非常适合存储对象的各个属性,如用户信息、商品信息等。可以将对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。例如,要存储ID为1的汽车对象,可以分别使用名为color、name和price的字段来存储该辆汽车的颜色、名称和价格。
同样,对于用户信息,可以将用户的ID作为Hash类型的键,用户的各种属性(如用户名、年龄、性别等)作为字段和字段值进行存储。

相关推荐
一条小小yu1 小时前
从零手写实现redis(四)添加监听器
java·数据库·redis
东方未明010815 小时前
Redis(三)单线程架构介绍
数据库·redis·数据库架构·单线程架构
代码的奴隶(艾伦·耶格尔)15 小时前
redis(1)
数据库·redis·缓存
赔罪20 小时前
HTML - <a>
java·前端·redis·vscode·html·webstorm
等一场春雨1 天前
linux wsl配置 redis远程连接
数据库·redis·缓存
唐梓航-求职中1 天前
缓存-Redis-缓存更新策略-主动更新策略-Cache Aside Pattern,先删除缓存,还是先更新数据库?
数据库·redis·缓存
唐梓航-求职中1 天前
缓存-Redis-缓存更新策略-主动更新策略-Cache Aside Pattern(全面 易理解)
redis·spring·缓存
等一场春雨1 天前
linux 查找redis 的配置文件 (`redis.conf`)
linux·运维·redis
@Java小牛马1 天前
分布式系统中的CAP理论(也称为 Brewer‘s 定理)
spring boot·redis·spring·spring cloud·分布式系统
唐梓航-求职中1 天前
缓存-Redis-缓存更新策略-主动更新策略-除了旁路缓存的其他策略
数据库·redis·缓存