11 Redis 哈希(Hash)

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

  • 实例

127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000\
OK
127.0.0.1:6379> HGETALL runoobkey
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) 到哈希表的 runoobkey 中。

Redis hash 命令

下表列出了 redis hash 基本的相关命令:

  • 1 Hdel

Redis Hdel 命令用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。

# 语法
redis 127.0.0.1:6379> HDEL KEY_NAME FIELD1.. FIELDN 


# 返回值
被成功删除字段的数量,不包括被忽略的字段。

# 实例
127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
127.0.0.1:6379> HGETall myhash
1) "field1"
2) "foo"
127.0.0.1:6379> HDEL myhash field1
(integer) 1
127.0.0.1:6379> Hgetall myhash
(empty list or set)
127.0.0.1:6379> HDEL myhash2 field1
(integer) 0
  • 2 Hexists

Redis Hexists 命令用于查看哈希表的指定字段是否存在。

# 语法
redis 127.0.0.1:6379> HEXISTS KEY_NAME FIELD_NAME 


# 返回值
如果哈希表含有给定字段,返回 1 。 如果哈希表不含有给定字段,或 key 不存在,返回 0 。

# 实例
127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
127.0.0.1:6379> HEXISTS myhash field1
(integer) 1
127.0.0.1:6379> HEXISTS myhash field2
(integer) 0
  • 3 Hget

Redis Hget 命令用于返回哈希表中指定字段的值。

# 语法
redis 127.0.0.1:6379> HGET KEY_NAME FIELD_NAME 


# 返回值
返回给定字段的值。如果给定的字段或 key 不存在时,返回 nil 。

# 实例

# 字段存在
127.0.0.1:6379> HSET site redis redis.com
(integer) 1
127.0.0.1:6379> HGET site redis
"redis.com"


# 字段不存在
127.0.0.1:6379> HGET site mysql
(nil)
  • 4 Hgetall

Redis Hgetall 命令用于返回哈希表中,所有的字段和值。
在返回值里,紧跟每个字段名(field name)之后是字段的值(value),所以返回值的长度是哈希表大小的两倍。

# 语法
redis 127.0.0.1:6379> HGETALL KEY_NAME 


# 返回值
以列表形式返回哈希表的字段及字段值。 若 key 不存在,返回空列表。


# 实例

127.0.0.1:6379> HSET myhash field1 "Hello"
(integer) 1
127.0.0.1:6379> HSET myhash field2 "World"
(integer) 1
127.0.0.1:6379> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "World"
  • 5 Hincrby

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

# 语法
redis 127.0.0.1:6379> HINCRBY KEY_NAME FIELD_NAME INCR_BY_NUMBER 

# 返回值
执行 HINCRBY 命令之后,哈希表中字段的值。


# 实例

# 对已存在的键进行设置
127.0.0.1:6379> HSET myhash field 5
(integer) 1
127.0.0.1:6379> HINCRBY myhash field 1
(integer) 6
127.0.0.1:6379> HINCRBY myhash field -10
(integer) -4 
  • 6 Hincrbyfloat

Redis Hincrbyfloat 命令用于为哈希表中的字段值加上指定浮点数增量值。
如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。

# 语法
redis 127.0.0.1:6379> HINCRBYFLOAT KEY_NAME FIELD_NAME INCR_BY_NUMBER 


# 返回值
执行 Hincrbyfloat 命令之后,哈希表中字段的值。


# 实例
127.0.0.1:6379> HSET mykey field 10.50
(integer) 1
127.0.0.1:6379> HINCRBYFLOAT mykey field 0.1
"10.6"
127.0.0.1:6379> HINCRBYFLOAT mykey field -5
"5.6"
127.0.0.1:6379> HSET mykey field 5.0e3
(integer) 0
127.0.0.1:6379> hINCRBYFLOAT mykey field 2.0e2
"5200"
  • 7 Hkeys

Redis Hkeys 命令用于获取哈希表中的所有域(field)。

# 语法
redis 127.0.0.1:6379> HKEYS KEY_NAME FIELD_NAME INCR_BY_NUMBER 


# 返回值
包含哈希表中所有域(field)列表。 当 key 不存在时,返回一个空列表。


# 实例

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

Redis Hlen 命令用于获取哈希表中字段的数量。

# 语法
redis 127.0.0.1:6379> HLEN KEY_NAME 


# 返回值
哈希表中字段的数量。 当 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
  • 9 Hmget

Redis Hmget 命令用于返回哈希表中,一个或多个给定字段的值。
如果指定的字段不存在于哈希表,那么返回一个 nil 值。

# 语法
redis 127.0.0.1:6379> HMGET KEY_NAME FIELD1...FIELDN 

# 返回值
一个包含多个给定字段关联值的表,表值的排列顺序和指定字段的请求顺序一样。


# 实例

# 对已存在的键进行设置
127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
127.0.0.1:6379> HMGET myhash field1 field2 nofield
1) "foo"
2) "bar"
3) (nil)
  • 10 Hmset

Redis Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中。
此命令会覆盖哈希表中已存在的字段。
如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。

# 语法
redis 127.0.0.1:6379> HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN  


# 返回值
如果命令执行成功,返回 OK 。


# 实例

# 对已存在的键进行设置
127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World"
OK
127.0.0.1:6379> HGET myhash field1
"Hello" 
127.0.0.1:6379> HGET myhash field2
"World"
  • 11 Hset

Redis Hset 命令用于为哈希表中的字段赋值 。
如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
如果字段已经存在于哈希表中,旧值将被覆盖。


# 语法
redis 127.0.0.1:6379> HSET KEY_NAME FIELD VALUE 

# 返回值
如果字段是哈希表中的一个新建字段,并且值设置成功,返回 1 。 如果哈希表中域字段已经存在且旧值已被新值覆盖,返回 0 。


# 实例
127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
127.0.0.1:6379> HGET myhash field1
"foo"
127.0.0.1:6379> HSET website google "www.g.cn"               # 设置一个新域
(integer) 1
127.0.0.1:6379> HSET website google "www.google.com"        # 覆盖一个旧域
(integer) 0
127.0.0.1:6379> HGET website google
"www.google.com"

  • 12 Hsetnx

Redis Hsetnx 命令用于为哈希表中不存在的的字段赋值 。
如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
如果字段已经存在于哈希表中,操作无效。
如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。

# 语法
redis 127.0.0.1:6379> HSETNX KEY_NAME FIELD VALUE


# 返回值
设置成功,返回 1 。 如果给定字段已经存在且没有操作被执行,返回 0 。


# 实例

redis 127.0.0.1:6379> HSETNX myhash field1 "foo"        # 操作无效, field1 已存在
(integer) 1
redis 127.0.0.1:6379> HSETNX myhash field1 "bar"     
(integer) 0
redis 127.0.0.1:6379> HGET myhash field1 
"foo"
  • 13 Hvals

Redis Hvals 命令返回哈希表所有域(field)的值。

# 语法
redis 127.0.0.1:6379> HVALS KEY_NAME FIELD VALUE 

# 返回值
一个包含哈希表中所有域(field)值的列表。 当 key 不存在时,返回一个空表。


# 实例

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

# 空哈希表/不存在的key
127.0.0.1:6379> exists 666
(integer) 0
127.0.0.1:6379> havls 666
(error) ERR unknown command 'havls'
127.0.0.1:6379> hvals 666
(empty list or set)

  • 14 HSCAN

迭代哈希表中的键值对。

# 语法
HSCAN key cursor [MATCH pattern] [COUNT count] 


# 返回值
哈希表中的键值对


# 实例
127.0.0.1:6379> hscan myhash 0
1) "0"
2) 1) "field1"
   2) "foo"
   3) "field2"
   4) "bar"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容