散列表

Redis 散列键是将一个 k 与一个 map 在数据库关联起来,和 string 类型一样,k-v 可以是文本,也能是二进制。

基本命令

HSET

设置 k-v 散列。

1
2
3
4
5
6
7
-- 设置 k-v,v 是一个 map
HSET article::10086 title "greeting"
HSET article::10086 content "hello world"
HSET article::10086 author "hanzhang"

-- 覆盖 title。如果不存在,则返回 1;存在就返回 0
HSET article::10086 title "good"

时间复杂度:O(1)

HSETNX

同 SETNX,只有在指定字段不存在时才会生效。

1
2
3
4
5
6
-- 不存在,设置成功,返回 true
HSETNX hanzhang name "hanzhang"
HSETNX hanzhang age 28

-- 存在,设置失败,返回 false
HSETNX hanzhang name "zhanghan"

时间复杂度:O(1)

HGET

查询 k-v 字符串。

1
2
3
4
5
-- 查询 title
HGET article::10086 "title"

-- 不存在 map 或者 title,返回 nil
HGET article::10086 "titl"

时间复杂度:O(1)

HSTRLEN

同 STRLEN,查询 map 中对应字段的长度。

1
2
3
4
-- 返回 len(hanzhang.name)
HSTRLEN hanzhang name
-- 不存在,返回 0
STRLEN gender

时间复杂度:O(n)

HEXISTS

检查 map 中对应的字段是否存在。

1
2
3
4
5
-- name 存在 -> 返回 true
HEXISTS hanzhang name

-- gender 不存在 -> 返回 false
HEXISTS hanzhang gender

时间复杂度:O(1)

HDEL

删除 map 中对应字段。

1
2
-- 获取 hanzhang 对应字段数量,不存在则返回 0
HLEN hanzhang

时间复杂度:O(1)

HLEN

获取 map 的字段数量。

1
2
3
SET message "hello world"
-- 获取 message[0,4]闭区间内容
GETRANGE message 0 4

时间复杂度:O(n)

HMSET

同时一次为散列中设置多个字段。

1
2
-- 给 hanzhang 设置 name 和 age 字段
HMSET hanzhang name "hanzhang" age 28

时间复杂度:O(n)

HMGET

同时获取多个字段。

1
2
3
4
-- 获取 hanzhang 的 name、age 和 gender
HMGET hanzhang name age gender
-- 由于 address 不存在,只有它会返回 null
HMGET hanzhang name age gender address

时间复杂度:O(n)

HKEYS

1
2
-- 获取 hanzhang 的所有 key
HKEYS hanzhang

HVALS

1
2
-- 获取 hanzhang 的所有 val
HVALS hanzhang

HGETALL

1
2
-- 获取 hanzhang 的所有 k-v
HGETALL hanzhang

对比字符串

散列的优点

  1. 只需要一个 key,就可以把人一多的字段存储到 key 中,减少资源消耗;
  2. 让数据更容易理解,方便操作;

字符串的优点

  1. 字符串的操作更丰富。例如,APPEND、SETRANGE 等;
  2. 过期时间设置比较灵活;

总结

  • k 和 v 都是既可以存储二进制,又可以存储字符串;
  • v 对应的是一个 map;
  • map 中的字段在底层是无序的;