Redis 的数据类型

Redis 的数据类型有 5 种,分别是 String,List,Set,Zset,Hash

String 类型

Redis 字符串存储字节序列,包括文本、序列化对象和二进制数组。因此,字符串是最基本的 Redis 数据类型。它们通常用于缓存,但它们支持额外的功能,允许实现计数器并执行逐位操作。

默认情况下,单个 Redis 字符串最多可以为 512 MB。

大多数字符串操作都是 O(1),这意味着它们非常高效。但是,请注意 SUBSTR、GETRANGE 和 SETRANGE 命令,它们可以是 O(n)。处理大字符串时,这些随机访问字符串命令可能会导致性能问题。

常用操作命令表格:

命令 说明
set 设置一个 key/value
get 根据 key 获得对应的 value
mset 一次设置多个 key value (mset key value key value..)
mget 一次获得多个 key 的 value (mget key key …)
strlen 获得对应 key 存储 value 的长度
append 为对应 key 的 value 追加内容
getrange 索引 0 开始 截取 value 的内容
setex 设置一个 key 存活的有效期(秒)
psetex 设置一个 key 存活的有效期(毫秒)
setnx 存在不做任何操作,不存在添加
msetnx 原子操作(只要有一个存在不做任何操作) 可以同时设置多个 key,只有有一个存在都不保存
decr 进行数值类型的-1 操作
decrby 根据提供的数据进行减法操作
Incr 进行数值类型的+1 操作
incrby 根据提供的数据进行加法操作
Incrbyfloat 根据提供的数据加入浮点数

set

set 命令用于设置键以保存字符串值。若键已经保存了一个值,不管其类型如何,它都会被覆盖。成功的 SET 操作将丢弃与密钥相关联的任何先前生存时间。

语法格式

1
SET key value [NX | XX] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]

选项
SET 命令支持一组修改其行为的选项:

  • NX 仅当 key 不存在时才设置 key,与 XX 互斥。
  • XX 仅当 key 存在时才设置 key,与 NX 互斥。
  • EX 设置 key 的过期时间,以秒为单位。
  • PX 设置 key 的过期时间,以毫秒为单位。
  • EXAT 设置 key 过期的指定 Unix 时间,以秒为单位。
  • PXAT 设置 key 过期的指定 Unix 时间,以毫秒为单位。
  • KEEPTTL 保留与 key 关联的生存时间。

返回值
简单字符串回复:如果 SET 执行正确,则 OK。

空回复:(nil)如果由于用户指定了 NX 或 XX 选项而未执行 SET 操作,但不满足条件。

示例

1
2
3
4
5
6
redis> SET mykey "Hello"
"OK"
redis> GET mykey
"Hello"
redis> SET anotherkey "will expire in a minute" EX 60
"OK"

get

get 命令获取 key 的值。如果键不存在,则返回特殊值 nil。如果键处存储的值不是字符串,则返回错误,因为 GET 只处理字符串值。

语法格式

1
GET key

返回值

返回 key 的值,或当 key 不存在时为 nil。

示例

1
2
3
4
redis> get test
"14"
redis> get 111
(nil)

mset

mset 命令用于批次设置 key,一次设置多个 key value

语法格式

1
MSET key value [key value ...]

返回值

始终正常,因为 MSET 不会失败。

示例

1
2
3
4
5
6
7
8
redis> MSET key1 "Hello" key2 "World"
"OK"
redis> GET key1
"Hello"
redis> GET key2
"World"

redis>

mget

mget 命令用于一次获得 key 的 value

语法格式

1
MGET key [key ...]

返回值
指定 key 的值列表。

示例

1
2
3
4
5
6
7
8
9
redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)
redis>

strlen

strlen 命令获得对应 key 存储 value 的长度

语法格式

1
STRLEN key

返回值
key 的字符串长度,或 key 不存在时为 0。

示例

1
2
3
4
5
6
7
redis> SET mykey "Hello world"
"OK"
redis> STRLEN mykey
(integer) 11
redis> STRLEN nonexisting
(integer) 0
redis>

append

append 命令为对应 key 的 value 追加内容,如果键已经存在并且是一个字符串,则此命令会在字符串末尾追加值。若键不存在,它将被创建并设置为空字符串,所以在这种特殊情况下,APPEND 将类似于 set。

语法格式

1
APPEND key value

返回值
追加操作后的字符串长度。

示例

1
2
3
4
5
6
7
8
9
redis> EXISTS mykey
(integer) 0
redis> APPEND mykey "Hello"
(integer) 5
redis> APPEND mykey " World"
(integer) 11
redis> GET mykey
"Hello World"
redis>

setex

setex 命令设置 key 保存字符串值,并设置 key 在给定秒数后超时。此命令相当于执行以下命令:

1
2
SET mykey value
EXPIRE mykey seconds

SETEX 是原子级的,可以通过使用 MULTI/EXEC 块中的前两个命令来复制。它是作为给定操作序列的一个更快的替代品提供的,因为当 Redis 用作缓存时,此操作非常常见。秒无效时返回错误。

语法格式

1
SETEX key seconds value

返回值
简单回复字符串

示例

1
2
3
4
5
6
7
redis> SETEX mykey 10 "Hello"
"OK"
redis> TTL mykey
(integer) 10
redis> GET mykey
"Hello"
redis>

psetex

psetex 的工作方式与 setex 完全相同,唯一的区别是过期时间以毫秒而不是秒为单位。

语法格式

1
PSETEX key milliseconds value

示例

1
2
3
4
5
6
7
redis> PSETEX mykey 1000 "Hello"
"OK"
redis> PTTL mykey
(integer) 1000
redis> GET mykey
"Hello"
redis>

setnx

如果键不存在,则将键设置为用户给定的字符串值。在这种情况下,它等于 SET。当键已经持有一个值时,不执行任何操作。SETNX 是“SET if Not exists”的缩写

语法格式

1
SETNX key value

返回值
整数回复,具体来说:

  • 如果设置了键,则为 1
  • 如果未设置密钥,则为 0

示例

1
2
3
4
5
6
7
redis> SETNX mykey "Hello"
(integer) 1
redis> SETNX mykey "World"
(integer) 0
redis> GET mykey
"Hello"
redis>

msetnx

将给定的键设置为其各自的值。即使只存在一个密钥,MSETNX 也不会执行任何操作。
由于这种语义,可以使用 MSETNX 来设置代表唯一逻辑对象的不同字段的不同键,以确保设置所有字段或根本不设置任何字段。
MSETNX 是原子的,因此所有给定的键都是一次性设置的。客户端无法看到某些密钥已更新,而其他密钥未更改。

语法格式

1
MSETNX key value [key value ...]

返回值
整数回复,具体来说:

  • 如果设置了所有键,则为 1。
  • 如果未设置键(至少已存在一个密钥),则为 0。

示例

1
2
3
4
5
6
7
8
9
redis> MSETNX key1 "Hello" key2 "there"
(integer) 1
redis> MSETNX key2 "new" key3 "world"
(integer) 0
redis> MGET key1 key2 key3
1) "Hello"
2) "there"
3) (nil)
redis>

decr

将存储在键上的数字减 1。如果键不存在,则在执行操作之前将其设置为 0。如果键包含错误类型的值或包含无法表示为整数的字符串,则返回错误。此操作仅限于 64 位有符号整数。

语法格式

1
DECR key

返回值
整数回复:减后的键值

示例

1
2
3
4
5
6
7
8
9
redis> SET mykey "10"
"OK"
redis> DECR mykey
(integer) 9
redis> SET mykey "234293482390480948029348230948"
"OK"
redis> DECR mykey
(error) value is not an integer or out of range
redis>

decrby

将存储在键上的数字递减。如果键不存在,则在执行操作之前将其设置为 0。如果键包含错误类型的值或包含无法表示为整数的字符串,则返回错误。此操作仅限于 64 位有符号整数。

语法格式

1
DECRBY key decrement

返回值
整数回复:减后的键值

示例

1
2
3
4
5
redis> SET mykey "10"
"OK"
redis> DECRBY mykey 3
(integer) 7
redis>

incr

将存储在键上的数字增加一。如果键不存在,则在执行操作之前将其设置为 0。如果键包含错误类型的值或包含无法表示为整数的字符串,则返回错误。此操作仅限于 64 位有符号整数。

注意:这是一个字符串操作,因为 Redis 没有专用的整数类型。存储在键上的字符串被解释为以 10 为基数的 64 位有符号整数,以执行操作。

Redis 以整数表示形式存储整数,因此对于实际包含整数的字符串值,不需要存储整数的字符串表示形式。

语法格式

1
INCR key

返回值
整数回复:加后的键值

示例

1
2
3
4
5
6
7
redis> SET mykey "10"
"OK"
redis> INCR mykey
(integer) 11
redis> GET mykey
"11"
redis>

incrby

按增量递增存储在键上的数字。如果键不存在,则在执行操作之前将其设置为 0。如果键包含错误类型的值或包含无法表示为整数的字符串,则返回错误。此操作仅限于 64 位有符号整数。

语法格式

1
INCRBY key increment

返回值
整数回复:加后的键值

示例

1
2
3
4
5
redis> SET mykey "10"
"OK"
redis> INCRBY mykey 5
(integer) 15
redis>

List 类型

单键多值 redis 列表是简单的字符串列表,按照插入顺序排序。 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

它的底层实际上是使用双向链表实现的,对两端的操作性能很高,通过索引下标操作中间节点性能会较差。

常用的工作指令

命令 说明
lpush 将某个值加入到一个 key 列表头部
lpushx 同 lpush,但是必须要保证这个 key 存在
rpush 将某个值加入到一个 key 列表末尾
rpushx 同 rpush,但是必须要保证这个 key 存在
lpop 返回和移除列表左边的第一个元素
rpop 返回和移除列表右边的第一个元素
lrange 获取某一个下标区间内的元素(lrange 起始下标 终点下标) 0-1 表示返回所有元素
llen 获取列表元素个数
lset 设置某一个指定索引的值(索引必须存在)
lindex 获取某一个指定索引位置的元素
lrem 删除重复元素 (lerm 要删除重复元素的个数 要删除的重复值)
ltrim 保留列表中特定区间内的元素
linsert 在某一个元素之前,之后插入新元素(linsert [要插入的列表名] [before 或者 after] 要插入位置元素名 要插入的元素值)

Set 类型

redis set 对外提供的功与 list 类似,是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要 存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择。

redis 的 set 是 string 类型的无序集合,他的底层实际是一个 value 为 null 的 hash 表,收益添加,删除,查 找复杂度都是 O(1)。 一个算法,如果时间复杂度是 O(1),那么随着数据的增加,查找数据的时间不变,也就是不管数据多 少,查找时间都是一样的。

Set 的常用命令列表

命令 说明
sadd 为集合添加元素
smembers 显示集合中所有元素 无序
scard 返回集合中元素的个数
spop 随机返回一个元素 并将元素在集合中删除
smove 从一个集合中向另一个集合移动元素 必须是同一种类型
srem 从集合中删除一个元素
sismember 判断一个集合中是否含有这个元素
srandmember 随机返回元素
sdiff 去掉第一个集合中其它集合含有的相同元素
sinter 求交集
sunion 求和集

ZSet

redis 有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合。

不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分 到最高分的方式排序集合中的成员。

集合的成员是唯一的,但是评分是可以重复的。

因为元素是有序的,所以你可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。

访问有序集合中的中间元素也是非常快的,因为你能够使用有序集合作为一个没有重复成员你的智能列表。

命令 说明
zadd 添加一个有序集合元素
zcard 返回集合的元素个数
zrange 升序 zrevrange 降序 返回一个范围内的元素
zrangebyscore 按照分数查找一个范围内的元素
zrank 返回排名
zrevrank 倒序排名
zscore 显示某一个元素的分数
zrem 移除某一个元素
zincrby 给某个特定元素加分

Hash

Redis hash 是一个键值对集合。 Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

命令 说明
hset 设置一个key/value对
hget 获得一个key对应的value
hgetall 获得所有的key/value对
hdel 删除某一个key/value对
hexists 判断一个key是否存在
hkeys 获得所有的key
hvals 获得所有的value
hmset 设置多个key/value
hmget 获得多个key的value
hsetnx 设置一个不存在的key的值
hincrby 为value进行加法运算
hincrbyfloat 为value加入浮点值