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

几乎所有的编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组。在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value={ {field1,value1},…{fieldN,valueN}} 哈希类型中的映射关系叫作field-value,注意这里的value是指field对应的值,不是键对应的值,请注意value在不同上下文的作用。 设置值

1
hset key filed value

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

1
2
3
4
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来做操作 获取值

1
hget key field

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

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

删除field

1
hdel key field [field ...]

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

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

计算field个数

1
hlen key

获取key为user:1的field个数

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

批量设置field-value

1
hmset key field value [field value ...]

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

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

批量获取field-value

1
hmget key field [field ...]

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

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

判断field是否存在

1
hexists key field

返回个数,没有就返回0

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

获取所有field

1
hkeys key

获取key为user:1的所有field

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

获取所有value

1
hvals key

获取key为user:1的所有value

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

获取所有的filed-value

1
hgetall key

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

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

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

1
hincrby key field increment

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

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

增加指定浮点数

1
hincrbyfloat key field increment

计算value的字符串长度

1
hstrlen key field

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

1
2
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)