type
status
date
slug
summary
tags
category
icon
password
数据结构
- 字符串(String):适用于简单键值存储和数值操作。
- 列表(List):适合有序数据的存储,例如任务队列。
- 哈希(Hash):适用于存储对象的属性,方便获取部分数据。
- 集合(Set):用于存储不重复的数据,如标签、用户ID去重等。
- 有序集合(ZSET):在集合的基础上增加了分数,适用于需要排序的场景,如排行榜和延时队列。
1. 字符串(String)
概念:
- Redis 中最基本的数据类型,就像普通的字符串,可以存储文本、数字、二进制数据等。
- 常用命令包括
SET
、GET
、INCR
、APPEND
等。
示例:
- 存储与获取字符串:
- 数值操作:
如果存储的是数字,可以使用
INCR
命令实现自增。2. 列表(List)
概念:
- 列表是一系列有序的字符串,内部实现为双向链表。
- 适用于实现消息队列、任务列表等场景。
- 常用命令包括
LPUSH
、RPUSH
(分别从左/右插入)、LPOP
、RPOP
(从左/右弹出)。
示例:
- 将任务添加到队列中,并从队列中取出任务:
说明:
在上面的例子中,任务依次被添加到列表中,使用 RPOP 从右侧弹出最早入队的任务。
3. 哈希(Hash)
概念:
- 哈希类似于一个字典或对象,它可以存储多个键值对(field-value 对),常用来存储对象的属性信息。
- 常用命令包括
HSET
、HGET
、HGETALL
、HMSET
(批量设置)、HMGET
(批量获取)。
示例:
- 存储用户信息:
- HSET user:1001 name "Alice"
- HSET user:1001 age "30"
说明:
哈希特别适合存储用户、产品等对象的多属性数据,既避免了序列化,也便于针对单个字段进行操作。
具体来说:
这条命令的意思是:在 key 为 user:1001 的哈希中,将字段 name 的值设为 "Alice"。
这条命令则是在同一个哈希(也就是同一个 key)中,添加或更新字段 age 的值为 "30"。
这样做的好处是,你可以把所有关于用户 1001 的信息(如姓名、年龄、邮箱等)都存储在一个整体中,而不是分散在多个独立的键中。例如,使用哈希类型,你可以这样存储一个用户的信息:
这样,user:1001 这个 key 对应的就是一个“对象”,其中包含了多个字段(name、age、email)及其对应的值。这不仅便于数据管理,而且查询时也可以只取出你需要的某个字段,而不必读取整个对象。
因此,HSET user:1001 name "Alice" 并不是存储了两个独立的 key,而是将“name”和对应的“Alice”作为一个字段-值对存储在 key user:1001 下面。这种方式非常适合存储结构化数据,就像存储一个用户对象一样。
4. 集合(Set)
概念:
- 集合是由不重复的字符串组成的无序集合,内部实现使用哈希表。
- 适用于去重、标签、共同好友等场景。
- 常用命令包括
SADD
、SMEMBERS
、SREM
、SCARD
等。
示例:
- 存储标签(Tag):
说明:
集合可以自动去重,添加重复的元素不会改变集合内容。
5. 有序集合(Sorted Set, ZSET)
概念:
- 有序集合与集合类似,也是不重复的字符串集合,但每个元素都会关联一个分数(score),根据分数自动排序。
- 适用于排行榜、延时队列、限流等场景。
- 常用命令包括
ZADD
、ZRANGE
、ZREVRANGE
、ZINCRBY
、ZRANK
等。
示例:
- 实现一个简单的排行榜:
说明:
向同一个有序集合
leaderboard
中添加了三个成员:Alice
、Bob
和 Charlie
,并分别赋予了它们分数 100
、150
和 120
利用 ZSET,你可以随时更新用户分数(使用 ZINCRBY),并通过 ZREVRANGE 取出分数最高的用户,构建实时排行榜。