2.6哈希

hash

特点 重要api hash vs string

哈希键值结构

key field value user:1:info

常用命令

命令

说明

时间复杂度

hget key field

获取key下field的value

O(1)

hset key field value

设置key下field的value

O(1)

hdel key field

删除key下field的value

O(1)

示例

127.0.0.1:6379> HSET user:1:info age 23
(integer) 1
127.0.0.1:6379> HGET user:1:info age
"23"
127.0.0.1:6379> HSET user:1:info name ronaldo
(integer) 1
127.0.0.1:6379> HGETALL user:1:info
1) "age"
2) "23"
3) "name"
4) "ronaldo"
127.0.0.1:6379> HDEL user:1:info age
(integer) 1
127.0.0.1:6379> HGETALL user:1:info
1) "name"
2) "ronaldo"

批量操作

命令

说明

时间复杂度

hmget key field1 field2 ...fieldN

批量获取key下多个field的value

O(n)

hmset key field1 value1 field2 value2 ...fieldN valueN

批量设置key下多个field value

O(n)

示例

127.0.0.1:6379> HMSET user:2:info age 30 name kaka page 50
OK
127.0.0.1:6379> HLEN user:2:info
(integer) 3
127.0.0.1:6379> HGETALL user:2:info
1) "age"
2) "30"
3) "name"
4) "kaka"
5) "page"
6) "50"
127.0.0.1:6379> HMGET user:2:info age name
1) "30"
2) "kaka"

获取操作

命令

说明

时间复杂度

hgetall key

返回hash key 对应所有的field和value

O(n)

hvals key

返回hash key 对应的所有的field的value

O(n)

hkeys key

返回hash key对应所有field

O(n)

示例

127.0.0.1:6379> HGETALL user:2:info
1) "age"
2) "30"
3) "name"
4) "kaka"
5) "page"
6) "50"
127.0.0.1:6379> HKEYS user:2:info
1) "age"
2) "name"
3) "page"
127.0.0.1:6379> HVALS user:2:info
1) "30"
2) "kaka"
3) "50"

提示:很多场景下,你并不需要获取key下所有的field,所以不建议使用hgetall。推荐使用hmget

其他操作

命令

说明

时间复杂度

hexists key field

判断hash key 是否存在field

O (1)

hlen key

获取hash key field 的数量

O(1)

示例

127.0.0.1:6379> HGETALL user:1:info
1) "name"
2) "ronaldo"
3) "age"
4) "23"
127.0.0.1:6379> HEXISTS user:1:info name
(integer) 1
127.0.0.1:6379> HEXISTS user:1:info name2
(integer) 0
127.0.0.1:6379> HLEN user:1:info
(integer) 2

命令

说明

时间复杂度

hsetnx key field value

设置key下field的value(如field已经存在,则失败)

O(1)

hincrby key field intCounter

key下field的value自增intCounter

O(1)

hincrbyfloat key field floatCounter

key下field的value自增floatCounter

O(1)

记录网站每个用户个人主页的访问量

hincrby user:1:info pageview count

hash vs string

使用redis存储用户信息的三种方案

  1. 使用String实现-V1

    key                     value(serilization:json,xml,protobuf)
    
    user:1                    {
                                "id":1,
                                "name":"ronaldo",
                                "age":40,
                                "pageView":50000
                             }
  2. 使用String实现-v2

    key                        value
    
    user:1:name                world
    user:1:age                40
    user:1:pageView            500000
  3. 使用hash实现

    key                        field        value
    
    user:1:info                name        ronaldo
                            age            40
                            pageView    500000

方案对比

方案

优点

缺点

string v1

编程简单;可以节约内存

序列化开销;设置属性要操作整个数据

string v2

直观,可以部分更新

占用内存较大,key较为分散

hash

直观,节省空间,可以部分更新

编程稍微复杂,ttl不好控制

Last updated

Was this helpful?