Redis学习笔记—数据类型:哈希(hash)

几乎所有的编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组。在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value={{field1,value1},…{fieldN,valueN}}

哈希类型中的映射关系叫作field-value,注意这里的value是指field对应的值,不是键对应的值,请注意value在不同上下文的作用。

设置值

hset key filed value

为key名为user:1设置field-value

127.0.0.1:6379> hset user:1 name Tom
(integer) 1
127.0.0.1:6379> hset user:1 age 26
(integer) 1

Redis额外提供了hsetnx命令;hset和hsetnx的关系与set和setnx的关系类似,如果没有则添加,如果有则不作操作,只不过hsetnx是对于field操作的,setnx是相对于key来做操作

获取值

hget key field

获取key为user:1,分别获取field为name和age的值

127.0.0.1:6379> hget user:1 name
"Tom"
127.0.0.1:6379> hget user:1 age
"26"

删除field

hdel key field [field ...]

删除key为user:1,field为sex的值;返回的是删除的个数

127.0.0.1:6379> hset user:1 sex male
(integer) 1
127.0.0.1:6379> hdel user:1 sex
(integer) 1

计算field个数

hlen key

获取key为user:1的field个数

127.0.0.1:6379> hlen user:1
(integer) 2

批量设置field-value

hmset key field value [field value ...]

批量设置key为user:2的field-value

127.0.0.1:6379> hmset user:2 name Jerry age 15
OK

批量获取field-value

hmget key field [field ...]

批量获取key为user:2的field为name和age的value

127.0.0.1:6379> hmget user:2 name age
1) "Jerry"
2) "15"

判断field是否存在

hexists key field

返回个数,没有就返回0

127.0.0.1:6379> hexists user:1 name
(integer) 1
127.0.0.1:6379> hexists user:1 job
(integer) 0

获取所有field

hkeys key

获取key为user:1的所有field

127.0.0.1:6379> hkeys user:1
1) "name"
2) "age"

获取所有value

hvals key

获取key为user:1的所有value

127.0.0.1:6379> hkeys user:1
1) "name"
2) "age"

获取所有的filed-value

hgetall key

获取key为user:1的所有filed-value

127.0.0.1:6379> hgetall user:1
1) "name"
2) "Tom"
3) "age"
4) "26"

使用hgetall时如果哈希元素过多,有可能造成Redis阻塞,尽量避免使用,可以用hscan命令渐进式遍历哈希类型

计数

增加指定数字

hincrby key field increment

给key为user:1,filed为age的value加5

127.0.0.1:6379> hget user:1 age
"26"
127.0.0.1:6379> hincrby user:1 age 5
(integer) 31

增加指定浮点数

hincrbyfloat key field increment

计算value的字符串长度

hstrlen key field

获取key为user:1,field为name的value长度

127.0.0.1:6379> hstrlen user:1 name
(integer) 3

内部编码

哈希类型的内部编码有两种:
– ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
– hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)

发表评论

邮箱地址不会被公开。 必填项已用*标注