开发者

Redis的Hash类型及相关命令小结

开发者 https://www.devze.com 2025-03-19 10:12 出处:网络 作者: 新绿MEHO
目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSETNXHINCRBYHINCRBYFLOAT内部编码应用场景HSET
目录
  • 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 的读写时间复杂度为 Ohttp://www.devze.com(1)。

下⾯的⽰例演⽰了哈希类型的内部编码,以及响应的变化。

1)当 field 个数⽐较少且没有⼤的 value 时,内部编码为 ziplist:

127.0.0.1:6379> hmset hashkey f1 v1 f2 v2

OK

127.0.0.1:6379http://www.devze.com> 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 个数超过 5www.devze.com12 时,内部编码也会转换为 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类型的键,用户的各种属性(如用户名、年龄、性别等)作为字段和字段值进行存储。

到此这篇关于Redis的Hash类型及相关命令小结的文章就介绍到这了,更多相关Redis Hash类型内容编程请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)! 

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号