Redis入门教程(一):基本数据类型
一、Redis是什么?为什么你需要它?
Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。与传统的关系型数据库不同,Redis将数据存储在内存中,使其读写速度达到惊人的11万次读/秒和8.1万次写/秒。同时支持数据持久化,重启后数据不丢失,完美平衡了速度与可靠性。
Redis的五大核心优势:
-
丰富的数据结构:支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等18
-
原子性操作:所有操作要么完全执行要么完全不执行,特别适合高并发场景
-
持久化机制:支持RDB快照和AOF日志两种持久化方式,确保数据安全
-
发布/订阅功能:原生支持消息队列,轻松实现系统解耦
-
跨平台:支持Linux、Windows、macOS等主流操作系统
二、Redis的典型应用场景
-
高速缓存:将MySQL热点数据缓存到Redis,提升网页加载速度
-
会话存储:分布式系统中存储用户登录状态,解决Session共享问题
-
实时排行榜:利用有序集合实现游戏积分实时排名
-
消息队列:通过List的LPUSH/BRPOP实现任务队列
-
社交关系:用集合(Set)存储好友列表,快速计算共同好友
三、数据类型详解
3.1 字符串(String):Redis 最基础的数据类型
字符串是 Redis 中最常用也最基础的数据类型,它能存储文本、数字甚至二进制数据,单个字符串的最大容量为 512MB。从底层实现来看,Redis 的字符串并非简单的 C 语言字符串,而是采用了简单动态字符串(SDS) 结构,这种结构不仅能高效支持字符串的拼接、截断等操作,还能避免缓冲区溢出问题。
核心特性
- 可以存储文本、数字、二进制数据(如图片、序列化对象)
- 支持原子性的自增、自减操作
- 能设置过期时间,适合实现缓存功能
常用命令
-
设置键值对,可指定过期时间(EX 为秒,PX 为毫秒)。SET key value [EX seconds] [PX milliseconds]
例如SET username "zhangsan" EX 3600表示设置username的值为zhangsan,1 小时后过期。
-
获取键对应的 value,若键不存在则返回nil。GET key
-
将键对应的数字值自增 1,若键不存在则先初始化为 0 再自增,返回结果为自增后的值。INCR key
-
将键对应的数字值自减 1,用法与INCR类似。DECR key
-
在原字符串后追加内容,返回追加后的总长度。例如APPEND message " world"会在message原 value 后加上 “world”。APPEND key value
-
返回字符串的长度。STRLEN key
应用场景
- 缓存热点数据:将数据库中频繁访问的数据缓存到 Redis 字符串中,如商品详情、用户信息等,设置合理的过期时间可减轻数据库压力。
- 计数器:利用INCR和DECR实现网站访问量统计、商品库存计数等功能,由于 Redis 操作的原子性,可避免并发问题。
- 分布式锁:通过SET key value NX EX seconds命令实现分布式锁,NX表示仅当键不存在时才设置成功,结合过期时间防止死锁。
- 会话存储:将用户登录后的会话信息序列化为字符串存储,实现分布式系统中的会话共享。
3.2 哈希(Hash):存储对象的理想选择
哈希类型类似于 Java 中的HashMap或 Python 中的字典,它允许一个键对应多个字段 - 值对,非常适合存储结构化数据。哈希类型的底层实现采用两种结构:当数据量较小时使用压缩列表(ziplist),当数据量增大后自动转换为哈希表(hashtable),这种动态调整机制保证了哈希类型的高效性。
核心特性
- 一个哈希表最多可包含 2^32 - 1 个字段 - 值对
- 字段和值都是字符串类型
- 支持对单个字段进行操作,无需修改整个对象
常用命令
-
为哈希表设置一个或多个字段 - 值对,返回成功设置的字段数量。例如HSET user:100 name "zhangsan" age "25"为user:100哈希表设置name和age字段。HSET key field value [field value ...]
-
获取哈希表中指定字段的值。HGET key field
-
获取哈希表中多个字段的值。HMGET key field1 field2 ...
-
返回哈希表中所有字段和值。HGETALL key
-
删除哈希表中的一个或多个字段,返回删除的字段数量。HDEL key field1 field2 ...
-
返回哈希表中所有字段名。HKEYS key
-
返回哈希表中所有字段值。HVALS key
-
返回哈希表中字段的数量。HLEN key
-
判断哈希表中是否存在指定字段,存在返回 1,不存在返回 0。HEXISTS key field
应用场景
- 存储对象数据:如用户信息(姓名、年龄、邮箱)、商品信息(名称、价格、库存)等结构化数据,相比使用多个字符串存储,哈希类型能更清晰地组织数据,减少键的数量。
- 用户属性管理:可方便地新增、修改或删除用户的单个属性,无需操作整个用户对象。
- 购物车实现:以用户 ID 为键,商品 ID 为字段,购买数量为值,实现购物车功能,通过HINCRBY可轻松修改商品数量。
3.3列表(List):有序集合的灵活实现
Redis 的列表是一种有序的字符串集合,允许元素重复,其底层实现采用双向链表或压缩列表(当数据量较小时)。列表支持在两端进行插入和删除操作,且操作时间复杂度为 O (1),这使得列表非常适合实现队列、栈等数据结构。
核心特性
- 元素按插入顺序排序,可重复存储
- 支持从头部和尾部插入、删除元素
- 可通过索引获取或修改元素,但索引操作时间复杂度为 O (n)
常用命令
-
在列表头部插入一个或多个元素,返回插入后列表的长度。LPUSH key value1 [value2 ...]
-
在列表尾部插入一个或多个元素,返回插入后列表的长度。RPUSH key value1 [value2 ...]
-
移除并返回列表的头部元素。LPOP key
-
移除并返回列表的尾部元素。RPOP key
-
返回列表中从start到stop索引范围内的元素(包含两端),索引从 0 开始,负数表示从尾部开始计数(如 - 1 表示最后一个元素)。例如LRANGE messages 0 9返回列表前 10 个元素。LRANGE key start stop
-
返回列表的长度。LLEN key
-
从列表中删除count个值为value的元素,count为正数时从头部开始删除,为负数时从尾部开始删除。LREM key count value
-
将列表中指定索引的元素设置为新值,若索引超出范围则返回错误。LSET key index value
应用场景
- 消息队列:使用LPUSH和RPOP实现先进先出(FIFO)的消息队列,生产者通过LPUSH向列表头部添加消息,消费者通过RPOP从尾部获取消息。
- 栈结构:使用LPUSH和LPOP实现后进先出(LIFO)的栈结构。
- 最新消息展示:如社交平台的朋友圈动态、新闻网站的最新资讯,通过LPUSH添加新消息,LRANGE获取最新的 N 条消息。
- 排行榜:结合LTRIM命令可实现只保留最新的 N 条数据,例如LTRIM activities 0 99只保留列表中前 100 条活动记录。
3.5集合(Set):无序去重的集合类型
集合是 Redis 中的无序集合,它不允许元素重复,底层实现采用哈希表或整数集合(intset)(当元素都是整数且数量较少时)。集合支持丰富的集合运算,如交集、并集、差集等,这使得它在社交关系、标签系统等场景中非常有用。
核心特性
- 元素无序且唯一,不允许重复
- 支持高效的添加、删除和查找操作(时间复杂度为 O (1))
- 提供强大的集合运算功能
常用命令
-
向集合中添加一个或多个元素,返回成功添加的元素数量(不包含已存在的元素)。例如SADD tags "java" "python" "redis"向tags集合添加三个标签。SADD key member1 [member2 ...]
-
返回集合中所有元素。SMEMBERS key
-
判断元素是否为集合的成员,是返回 1,否返回 0。SISMEMBER key member
-
从集合中删除一个或多个元素,返回成功删除的元素数量。SREM key member1 [member2 ...]
-
返回集合的元素数量。SCARD key
-
随机从集合中删除并返回count个元素,默认返回 1 个。SPOP key [count]
-
随机返回集合中count个元素,不会删除元素。SRANDMEMBER key [count]
-
返回多个集合的交集。SINTER key1 key2 ...
-
返回多个集合的并集。SUNION key1 key2 ...
-
返回多个集合的差集(存在于第一个集合但不存在于其他集合的元素)。SDIFF key1 key2 ...
应用场景
- 好友关系管理:存储用户的好友列表,通过SINTER计算两个用户的共同好友,SUNION合并多个好友列表。
- 标签系统:为文章、商品等添加标签,通过SADD添加标签,SMEMBERS获取所有标签,SINTER查找同时拥有多个标签的内容。
- 去重操作:利用集合元素的唯一性,对数据进行去重处理,如记录用户的浏览历史,避免重复记录。
- 抽奖系统:使用SPOP或SRANDMEMBER实现随机抽奖功能,SPOP会删除抽中的元素,SRANDMEMBER则不会。
3.3有序集合(Sorted Set):带分数的有序集合
有序集合是 Redis 中最具特色的数据类型之一,它结合了集合和排序的特性,每个元素都关联一个分数(score),并按照分数从小到大排序。底层实现采用跳跃表(skiplist) 和哈希表,跳跃表保证了高效的排序和范围查询,哈希表则用于快速查找元素的分数。
核心特性
- 元素唯一且有序,排序依据是元素的分数
- 支持按分数范围查询和排序
- 添加、删除和查找操作的时间复杂度为 O (logN)
常用命令
-
向有序集合中添加一个或多个元素及其分数,返回成功添加的元素数量。例如ZADD ranking 95 "zhangsan" 88 "lisi" 92 "wangwu"向ranking有序集合添加三个用户及其分数。ZADD key score1 member1 [score2 member2 ...]
-
返回有序集合中指定范围的元素,按分数从小到大排序,WITHSCORES选项可同时返回元素的分数。例如ZRANGE ranking 0 4 WITHSCORES返回排名前 5 的用户及其分数。ZRANGE key start stop [WITHSCORES]
-
返回有序集合中指定范围的元素,按分数从大到小排序。ZREVRANGE key start stop [WITHSCORES]
-
返回元素在有序集合中的分数。ZSCORE key member
-
为有序集合中的元素增加分数,返回增加后的分数。例如ZINCRBY ranking 2 "zhangsan"将zhangsan的分数增加 2。ZINCRBY key increment member
-
返回有序集合的元素数量。ZCARD key
-
返回分数在min到max范围内的元素数量。ZCOUNT key min max
-
返回元素按分数从小到大排序后的排名(从 0 开始)。ZRANK key member
-
返回元素按分数从大到小排序后的排名(从 0 开始)。ZREVRANK key member
应用场景
- 排行榜系统:如游戏积分排名、考试成绩排名、商品销量排名等,通过ZADD添加或更新分数,ZREVRANGE获取排名靠前的用户。
- 带权重的消息队列:为消息设置分数作为优先级,消费者通过ZREVRANGE按优先级获取消息。
- 范围查询:如查询分数在 90 - 100 分之间的学生、价格在 100 - 500 元之间的商品等,使用ZCOUNT和ZRANGEBYSCORE实现。
- 时间序列数据:将时间戳作为分数,存储监控数据、日志时间等,可按时间范围查询数据。
命令速记表
数据类型 | 写入命令 | 读取命令 | 删除命令 |
---|---|---|---|
字符串 | SET | GET | DEL |
哈希 | HSET | HGET | HDEL |
列表 | LPUSH | LRANGE | LPOP |
总结
Redis凭借其毫秒级响应和灵活的数据模型,已成为现代应用栈的核心组件。无论是缓解数据库压力,还是实现实时排行榜,亦或构建消息队列,它都能游刃有余。掌握Redis,就是为你的系统装上高性能引擎 。
学习资源扩展:
-
官方文档:Docs
-
命令大全:redis 命令手册