Redis 哈希(Hash)

Redis 哈希(Hash)

Redis hash 是一个 string 类型的 field(字段)和 value(值)的映射表,hash 特别适合用于存储对象

Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)

实例

127.0.0.1:6379> HMSET appblog name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379> HGETALL appblog
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"

在以上实例中,我们设置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 appblog 中

Redis hash 命令

hdel key field1 [field2]

删除一个或多个哈希表字段,不存在的字段将被忽略

redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HDEL myhash field1
(integer) 1
redis 127.0.0.1:6379> HDEL myhash field2
(integer) 0

hexists key field

查看哈希表 key 中,指定的字段是否存在

redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HEXISTS myhash field1
(integer) 1
redis 127.0.0.1:6379> HEXISTS myhash field2
(integer) 0

hget key field

获取存储在哈希表中指定字段的值,不存在时返回 nil

# 字段存在

redis> HSET site redis redis.com
(integer) 1

redis> HGET site redis
"redis.com"

# 字段不存在

redis> HGET site mysql
(nil)

hgetall key

获取在哈希表中指定 key 的所有字段和值

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"
redis> 

hincrby key field increment

为哈希表 key 中的指定字段的整数值加上增量 increment

  • 增量也可以为负数,相当于对指定字段进行减法操作
  • 如果哈希表的 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令
  • 如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0
  • 对一个储存字符串值的字段执行 HINCRBY 命令将造成一个错误
  • 本操作的值被限制在 64 位(bit)有符号数字表示之内
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
redis> 

hincrbyfloat key field increment

为哈希表 key 中的指定字段的浮点数值加上增量 increment

如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0

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"
redis> 

hkeys key

获取所有哈希表中的字段

redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HKEYS myhash
1) "field1"
2) "field2"

hlen key

获取哈希表中字段的数量

当 key 不存在时,返回 0

redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HLEN myhash
(integer) 2

hmget key field1 [field2]

获取所有给定字段的值

如果指定的字段不存在于哈希表,那么返回一个 nil 值

redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HMGET myhash field1 field2 nofield
1) "foo"
2) "bar"
3) (nil)

hmset key field1 value1 [field2 value2 ]

同时将多个 field-value (域-值)对设置到哈希表 key 中

  • 此命令会覆盖哈希表中已存在的字段
  • 如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作
redis 127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World"
OK
redis 127.0.0.1:6379> HGET myhash field1
"Hello"
redis 127.0.0.1:6379> HGET myhash field2
"World"

hset key field value

将哈希表 key 中的字段 field 的值设为 value

  • 如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作
  • 如果字段已经存在于哈希表中,旧值将被覆盖
redis 127.0.0.1:6379> HSET myhash field1 "foo"
OK
redis 127.0.0.1:6379> HGET myhash field1
"foo"

redis 127.0.0.1:6379> HSET website google "www.g.cn"       # 设置一个新域
(integer) 1

redis 127.0.0.1:6379> HSET website google "www.google.com" # 覆盖一个旧域
(integer) 0

bashnx key field value

只有在字段 field 不存在时,设置哈希表字段的值

  • 如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作
  • 如果字段已经存在于哈希表中,操作无效
  • 如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令
redis 127.0.0.1:6379> HSETNX myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSETNX myhash field1 "bar"
(integer) 0
redis 127.0.0.1:6379> HGET myhash field1
"foo"

hvals key

获取哈希表中所有值,当 key 不存在时,返回一个空表

redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HVALS myhash
1) "foo"
2) "bar"

# 空哈希表/不存在的key

redis 127.0.0.1:6379> EXISTS not_exists
(integer) 0

redis 127.0.0.1:6379> HVALS not_exists
(empty list or set)

hscan key cursor [MATCH pattern] [COUNT count]

迭代哈希表中的键值对

Redis HSCAN 命令基本语法如下:

HSCAN key cursor [MATCH pattern] [COUNT count]
``

- cursor - 游标
- pattern - 匹配的模式
- count - 指定从数据集里返回多少元素,默认值为 10

```bash
> HMSET sites google "google.com" appblog "appblog.cn" weibo "weibo.com" taobao "taobao.com"
OK
> HSCAN sites 0 match "run*"
1) "0"
2) 1) "appblog"
2) "appblog.cn"

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/02/24/redis-hash/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Redis 哈希(Hash)
Redis 哈希(Hash) Redis hash 是一个 string 类型的 field(字段)和 value(值)的映射表,hash 特别适合用于存储对象 Redis 中每个 hash 可以存储 2^32 - 1 ……
<<上一篇
下一篇>>
文章目录
关闭
目 录