命令 | 功能 |
hset key field value | 设置哈希值 |
hsetnx | 设置哈希值,field或键必须不存在 |
hget | 获取某个file对应的值 |
hdel | 删除一个或多个field-value |
hlen | 计算field的个数 |
hmset | 批量设置field-value |
hmget | 批量获取field-value |
hexists | 判断某个field是否存在 |
hkeys | 获取所有的field |
hvals | 获取所有的value |
hgetall | 获取所有的field-value |
hincrby | 自增整数 |
hincrbyfloat | 自增浮点数 |
hstrlen | 计算value字符串的长度 |
几乎所有的编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组。
在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value={{field1,value1},...{fieldN,valueN}},
Redis键值对和哈希类型二者的关系可以用下图来表示:
注意:哈希类型中的映射关系叫做field-value,注意这里的value是指field对应的值,不是键对应的值,一定要注意value在不同上下文的作用。
下面介绍一些哈希常用的命令。
1)设置值
命令:hset key field value
127.0.0.1:6379> hset user:1 name kebi (integer) 1 127.0.0.1:6379> hset user:1 age 26 (integer) 1
如果设置成功会返回1,反之会返回0。
此外Redis提供了hsetnx命令,它们的关系就像set和setnx命令一样,只不过作用域由键变为field。
127.0.0.1:6379> hexists user:1 name (integer) 1 #user:1 name存在 127.0.0.1:6379> hsetnx user:1 name xiaoniao (integer) 0 #没有设置成功 127.0.0.1:6379> hget user:1 name "kebi" 127.0.0.1:6379> hsetnx user:4 name xiaoniao (integer) 1 127.0.0.1:6379> hget user:4 name "xiaoniao" #field不存在才行
2)获取值
命令:hget key field
127.0.0.1:6379> hget user:1 name "kebi" 127.0.0.1:6379> hget user:1 dorm (nil)
如果键的field不存在或者或键本身就不存在,会返回nil。
3)删除field
命令:hdel key field [field ...]
hdel会删除一个或多个field,返回结果为成功删除field的个数:
127.0.0.1:6379> hkeys user:1 1) "name" 2) "age" 3) "sex" 127.0.0.1:6379> hdel user:1 name (integer) 1 127.0.0.1:6379> hkeys user:1 1) "age" 2) "sex"
注意如果要删除键,还是使用del:
127.0.0.1:6379> del user:1 (integer) 1 127.0.0.1:6379> exists user:1 (integer) 0
并没有说能单独删除哈希的value,因为没有意义。
4)计算field的个数
命令:hlen key
127.0.0.1:6379> hset user:1 name kebi (integer) 1 127.0.0.1:6379> hset user:1 age 26 (integer) 1 127.0.0.1:6379> hset user:1 sex boy (integer) 1 127.0.0.1:6379> hlen user:1 (integer) 3
5)批量设置或获取field-value
命令:
hmget key field [field ...]
hmset key field value [field value ...]
hmset和hmget分别是批量设置和获取field-value,hmset需要的参数是key和多对field-value,hmget需要的参数是key和多个field:
127.0.0.1:6379> hmget user:1 name age sex 1) "kebi" 2) "26" 3) "boy" 127.0.0.1:6379> hmset user:2 name maoxian age 25 sex boy OK 127.0.0.1:6379> hmget user:2 name age sex 1) "maoxian" 2) "25" 3) "boy"
6)判断field是否存在
命令:hexists key field
127.0.0.1:6379> hexists user:1 name (integer) 1 127.0.0.1:6379> hexists user:1 dorm (integer) 0
如果field存在,返回结果为1,如果不存在返回0.
7)获取所有的field
命令:hkeys key
hkeys命令应该叫hfields更为恰当,它返回指定哈希键所有的field:
127.0.0.1:6379> keys * #返回所有的键 1) "user:2" 2) "user:1" 127.0.0.1:6379> hkeys user:1 #返回键user:1所有的field 1) "name" 2) "age" 3) "sex" 127.0.0.1:6379> hkeys user:2 1) "name" 2) "age" 3) "sex"
8)获取所有value
命令:hvals key
127.0.0.1:6379> hvals user:1 1) "kebi" 2) "26" 3) "boy" 127.0.0.1:6379> hvals user:2 1) "maoxian" 2) "25" 3) "boy"
9)获取所有的field-value
命令:hgetall key
127.0.0.1:6379> hgetall user:1 1) "name" 2) "kebi" 3) "age" 4) "26" 5) "sex" 6) "boy"
注意:在使用hgetall时,如果哈希元素个数比较多,会存在阻塞Redis的可能。
如果只需要获取部分field,可以使用hmget,如果一定要回去全部的field-value,可以使用hscan命令,该命令会渐进式遍历哈希类型。
10)hincrby hincrbyfloat
命令:
hincrby key field
hincrbyfloat key field
hincrby和hincrbyfloat命令一样,但是它们的作用域是field。
11)计算value的字符长度(需要Redis3.2版本以上)
命令:hstrlen key field
下面提供一张哈希类型命令的时间复杂度,可以根据自身的需求选择合适的命令。
命令 | 时间复杂度 |
hset key field value | O(1) |
hget key field | O(1) |
hdel key field [field ...] | O(k),k是field个数 |
hlen key | O(1) |
hgetall key | O(n),n是field总数 |
hmget field [field ...] | O(k),k是field个数 |
hmset field value [field value...] | O(k),k是field个数 |
hexists key field | O(1) |
hkeys key | O(n),n是field总数 |
hvals key | O(n),n是field总数 |
hsetnx key field value | O(1) |
hincrby key field increment | O(1) |
hincrbyfloat key field increment | O(1) |
hstrlen key field | O(1) |