文章目录
  1. Redis基本命令的使用-哈希
  2. 1. 简介
  3. 2. 命令
  4. 3. 内部编码
    1. 3.1 ziplist(压缩列表)
    2. 3.2 hashtable(哈希表)

[TOC]

Redis基本命令的使用-哈希

1. 简介

Redis中的哈希是指键值本身又是一个键值对的结构。

具体结构如下图:

2. 命令

  • 设置值
1
2
3
4
5
$ hset key field value

> 示例
127.0.0.1:6379> hset user:1 name tom
(integer) 1

其他相同命令

1
2
3
$ hsetnx key field value

# 作用类似于setnx, 只不过作用域变成了field
  • 获取值
1
2
3
4
5
6
7
$ hget key field

# 如果键或field不存在,返回nil

> 示例
127.0.0.1:6379> hget user:1 name
"tom"
  • 删除field
1
2
3
4
5
6
7
8
9
$ hdel key field [field ...]

# 返回成功删除field的个数

> 示例
127.0.0.1:6379> hdel user:1 name
(integer) 1
127.0.0.1:6379> hdel user:1 age
(integer) 0
  • 计数field数量
1
2
3
4
5
6
7
8
9
10
11
$ hlen key

> 示例
127.0.0.1:6379> hlen user:1
(integer) 0
127.0.0.1:6379> hset user:1 name tom
(integer) 1
127.0.0.1:6379> hset user:1 age 20
(integer) 1
127.0.0.1:6379> hlen user:1
(integer) 2
  • 批量设置/获取field-value
1
2
$ hmset key field value [field value ...]
$ hmget key field [field ...]
  • 判断field是否存在
1
2
3
$ hexists key field

# 存在返回1,否则返回0
  • 获取所有的field
1
2
3
4
5
6
$ hkeys key

> 示例
127.0.0.1:6379> hkeys user:1
1) "name"
2) "age"
  • 获取所有的value
1
2
3
4
5
6
$ hvals key

> 示例
127.0.0.1:6379> hvals user:1
1) "tom"
2) "20"
  • 获取所有的field-value
1
2
3
4
5
6
7
8
$ hgetall key

> 示例
127.0.0.1:6379> hgetall user:1
1) "name"
2) "tom"
3) "age"
4) "20"

注意:使用hgetall时,如果哈希元素很多,会有阻塞redis的可能。如果只是获取部分field,可以使用hmget。当然,如果一定要获取全部,可以使用hscan,后续会解释。

  • incrby相关
1
2
3
4
$ hincrby key field increment
$ hincrbyfloat key field increment

# 与incrby和incrbyfloat类似,只是作用域是field
  • 计算value字符串长度(>=reids3.2)
1
2
3
$ hstrlen key field

# 与strlen类似

3. 内部编码

3.1 ziplist(压缩列表)

当哈希类型的元素个数小于hash-max-ziplist-entries(默认512个),并且所有的值都小于hash-max-ziplist-value(默认64字节)时,Redis会使用ziplist作为哈希的内部实现,使用更加紧凑的结构实现,在节省内存上比hashtable更加优秀。

3.2 hashtable(哈希表)

当无法满足ziplist条件时,Redis会使用hashtable的方式。因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。

Tips:关于ziplist和hashtable的具体结构,可以自行查询,可能后面也会做分析。

文章目录
  1. Redis基本命令的使用-哈希
  2. 1. 简介
  3. 2. 命令
  4. 3. 内部编码
    1. 3.1 ziplist(压缩列表)
    2. 3.2 hashtable(哈希表)