Skip to content

第1章 走进Redis:从概念到价值

大家好,今天开始,我们正式开启Redis系列教程的学习之旅。作为一名技术开发者,你大概率在项目中用过缓存、做过分布式会话,而这些场景背后,Redis往往是核心支撑工具。

本章作为入门开篇,不急于深入底层原理,而是先帮大家建立对Redis的整体认知:搞清楚“什么是Redis”“Redis能解决什么问题”“和其他数据库有啥区别”,以及“该如何系统学习Redis”。内容偏基础但干货密集,会穿插实用的工具推荐和代码示例,适合Redis新手或想梳理知识体系的同学。

1.1 什么是Redis:非关系型数据库的核心定义

我们先看官方定义(来源:Redis官方文档):

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, message broker, and streaming engine.

翻译成中文:Redis是一款开源(基于BSD许可)的内存数据结构存储,可作为数据库、缓存、消息代理和流处理引擎使用。

这个定义里有两个核心关键词,必须先吃透:

1.1.1 核心关键词1:内存存储

这是Redis高性能的根本原因。和MySQL等传统关系型数据库不同,Redis的数据主要存储在内存中,而不是磁盘。内存的读写速度(毫秒级)远快于磁盘(毫秒级→秒级),这也是Redis能支撑高并发场景的核心基础。

但这里有个关键问题:内存数据断电易失,所以Redis提供了“持久化”机制(后续第6章详细讲解),可以将内存数据异步写入磁盘,保证数据安全性。

1.1.2 核心关键词2:数据结构存储

这是Redis灵活强大的核心。传统关系型数据库存储的是“表结构”数据,而Redis直接存储“数据结构”,比如字符串(String)、哈希(Hash)、列表(List)等,开发者可以直接操作这些数据结构,无需像MySQL那样通过“表-行-列”的结构间接操作。

1.1.3 快速体验:Redis基础命令(入门示例)

为了让大家有直观感受,这里先放一个简单的Redis命令示例(后续章节会详细讲解,此处仅作体验)。假设你已经安装了Redis(1.6节会讲安装),打开终端输入redis-cli进入命令行客户端,执行以下命令:

bash

# 存储一个字符串键值对(用户ID:1001,用户名:zhangsan)
127.0.0.1:6379> SET user:1001 zhangsan
OK

# 获取该键值对
127.0.0.1:6379> GET user:1001
"zhangsan"

# 存储一个哈希结构(用户ID:1002的详细信息)
127.0.0.1:6379> HSET user:1002 name lisi age 25 gender male
(integer) 3

# 获取该用户的所有信息
127.0.0.1:6379> HGETALL user:1002
1) "name"
2) "lisi"
3) "age"
4) "25"
5) "gender"
6) "male"

从示例能看出,Redis的操作非常直观,直接围绕“键-数据结构”展开,这也是它深受开发者喜爱的原因之一。

1.2 Redis的核心特性:高性能、高可用与灵活数据结构

Redis之所以能成为分布式系统中的“瑞士军刀”,核心在于它具备一系列贴合业务需求的特性。下面逐个拆解,每个特性都结合实际应用场景说明,让大家理解“为什么这个特性有用”。

1.2.1 高性能:百万级QPS的支撑

Redis的高性能是业界公认的,官方数据显示:单节点Redis可支撑每秒10万+的读写操作(QPS),延迟可低至亚毫秒级。这一性能表现主要源于三个设计:

  1. 内存存储:如1.1节所述,内存读写速度远快于磁盘,避免了磁盘IO的性能瓶颈;

  2. 单线程模型:Redis采用单线程处理用户请求(核心网络IO和数据操作),避免了多线程上下文切换的开销;

  3. IO多路复用:通过epoll/kqueue等IO多路复用技术,单线程可同时处理多个客户端连接,实现高并发。

这里补充一个常见误区:“单线程”不等于“低并发”。Redis的单线程是指“核心操作单线程”,而持久化、集群同步等操作是在后台线程执行的,不会影响核心读写性能。

1.2.2 高可用:集群与哨兵保障服务稳定

对于生产环境而言,“稳定”是底线。Redis通过“主从复制”“哨兵机制”“集群部署”三大能力保障高可用:

  • 主从复制:一台主节点(Master)可同步数据到多台从节点(Slave),主节点故障时,从节点可切换为新主节点,避免数据丢失;

  • 哨兵机制:自动监控主从节点状态,主节点故障时自动触发故障转移,无需人工干预;

  • 集群部署:Redis Cluster支持多主多从架构,不仅能实现高可用,还能通过分片扩展存储容量和并发能力。

后续第13、14章会详细讲解这些机制的实现原理和搭建方法。

1.2.3 灵活的数据结构:覆盖多场景需求

这是Redis最核心的竞争力之一。Redis支持多种原生数据结构,且每种结构都有对应的高效操作命令,覆盖了大部分业务场景:

数据结构核心特点典型应用场景
String(字符串)简单键值对,支持自增自减计数器、缓存用户信息、分布式锁
Hash(哈希)键值对集合,适合存储对象用户详情、商品信息
List(列表)有序可重复,支持首尾操作消息队列、最新消息列表
Set(集合)无序不可重复,支持交集/并集好友关系、标签去重
Sorted Set(有序集合)有序不可重复,基于分数排序排行榜、热搜榜

除了上述基础结构,Redis还支持BitMap(位图)、HyperLogLog(基数统计)、Geospatial(地理空间)等高级数据结构,后续第5章会详细讲解。

1.2.4 其他实用特性

  • 持久化:支持RDB和AOF两种持久化方式,保证内存数据不丢失;

  • 过期键自动删除:支持为键设置过期时间,自动删除过期数据,适合缓存场景;

  • 分布式能力:支持分布式锁、分布式计数器等,适配分布式系统架构;

  • 多语言支持:几乎所有主流编程语言都有Redis客户端(Java、Python、Go等),集成成本低。

1.3 Redis的应用场景:缓存、队列、计数器等典型场景解析

了解了Redis的特性后,我们再看它在实际业务中的落地场景。Redis的应用范围极广,这里挑5个最典型、最常用的场景,结合代码示例和实现思路讲解。

1.3.1 场景1:缓存(最核心场景)

缓存是Redis最经典的应用场景。通过将热点数据缓存到Redis中,用户请求直接从Redis获取,避免频繁查询数据库,从而提升系统响应速度、减轻数据库压力。

实现思路

  1. 用户请求数据时,先查询Redis;

  2. 若Redis中有数据(缓存命中),直接返回;

  3. 若Redis中无数据(缓存未命中),查询数据库,将结果写入Redis(设置过期时间),再返回给用户。

代码示例(Java + Jedis客户端)

java

import redis.clients.jedis.Jedis;

public class RedisCacheDemo {
    public static void main(String[] args) {
        // 连接Redis(实际生产中需使用连接池)
        Jedis jedis = new Jedis("localhost", 6379);
        // 模拟用户查询商品信息(商品ID:1001)
        String productId = "1001";
        String cacheKey = "product:" + productId;

        // 1. 先查缓存
        String productInfo = jedis.get(cacheKey);
        if (productInfo != null) {
            System.out.println("从缓存获取数据:" + productInfo);
            jedis.close();
            return;
        }

        // 2. 缓存未命中,查数据库(这里用模拟数据代替)
        productInfo = queryProductFromDB(productId);
        System.out.println("从数据库获取数据:" + productInfo);

        // 3. 写入缓存,设置过期时间(30分钟)
        jedis.setex(cacheKey, 30 * 60, productInfo);

        jedis.close();
    }

    // 模拟查询数据库
    private static String queryProductFromDB(String productId) {
        return "{\"id\":\"1001\",\"name\":\"Redis实战教程\",\"price\":99.0}";
    }
}

注意:缓存场景需解决“缓存穿透、缓存击穿、缓存雪崩”三大问题,后续第9章会专门讲解解决方案。

1.3.2 场景2:分布式计数器

在分布式系统中,需要统计全局数据(如秒杀库存、接口访问量、用户签到次数)时,Redis的自增自减命令(incr/decr)是绝佳选择。这些命令是原子性的,不会出现并发问题。

实现思路

利用Redis的INCR(自增1)、DECR(自减1)、INCRBY(自增指定数值)命令,直接操作键的数值,无需加锁。

代码示例(秒杀库存统计)

bash

# 初始化秒杀商品库存(100件)
127.0.0.1:6379> SET seckill:stock:1001 100
OK

# 用户抢购,库存减1(原子操作)
127.0.0.1:6379> DECR seckill:stock:1001
(integer) 99

# 查看剩余库存
127.0.0.1:6379> GET seckill:stock:1001
"99"

# 批量扣减库存(如一次性扣5件)
127.0.0.1:6379> DECRBY seckill:stock:1001 5
(integer) 94

应用扩展:结合EXPIRE命令可实现“今日访问量统计”(设置键过期时间为当天24点)。

1.3.3 场景3:消息队列

Redis的List(列表)结构支持LPUSH(左进)和BRPOP(右出,阻塞)命令,可轻松实现简单的消息队列。适合对消息可靠性要求不高、并发量适中的场景(如日志收集、异步通知)。

实现思路(生产者-消费者模型)

  • 生产者:通过LPUSH将消息写入队列;

  • 消费者:通过BRPOP从队列尾部获取消息(若队列空则阻塞等待,避免轮询浪费资源)。

代码示例(命令行模拟)

bash

# 生产者端:写入3条消息
127.0.0.1:6379> LPUSH msg:queue "消息1:用户注册成功"
(integer) 1
127.0.0.1:6379> LPUSH msg:queue "消息2:订单支付完成"
(integer) 2
127.0.0.1:6379> LPUSH msg:queue "消息3:物流状态更新"
(integer) 3

# 消费者端:获取消息(阻塞等待,超时时间10秒)
127.0.0.1:6379> BRPOP msg:queue 10
1) "msg:queue"
2) "消息1:用户注册成功"
127.0.0.1:6379> BRPOP msg:queue 10
1) "msg:queue"
2) "消息2:订单支付完成"

注意:Redis List实现的消息队列不支持消息确认(ACK)和持久化保障,若需高可靠消息队列,建议使用RabbitMQ、Kafka;Redis 5.0+推出的Stream结构支持ACK和持久化,可替代List实现更可靠的消息队列(后续第11章详细讲解)。

1.3.4 场景4:排行榜

电商平台的商品销量榜、游戏的玩家积分榜、社交平台的热搜榜等场景,都需要对数据进行排序。Redis的Sorted Set(有序集合)结构天生适合做排行榜,支持按分数排序、快速查询排名。

实现思路

  • 将“用户ID/商品ID”作为Sorted Set的成员(member);

  • 将“销量/积分/热度”作为分数(score);

  • 通过ZADD添加成员,ZREVRANGE按分数倒序查询(获取排行榜)。

代码示例(游戏积分排行榜)

bash

# 添加3个玩家的积分(用户ID:101、102、103,积分:95、88、100)
127.0.0.1:6379> ZADD game:rank 95 101 88 102 100 103
(integer) 3

# 获取积分前3名(倒序排列,withscores显示分数)
127.0.0.1:6379> ZREVRANGE game:rank 0 2 WITHSCORES
1) "103"
2) "100"
3) "101"
4) "95"
5) "102"
6) "88"

# 获取用户101的排名(从0开始)
127.0.0.1:6379> ZREVRANK game:rank 101
(integer) 1

# 用户102积分增加5分(更新排名)
127.0.0.1:6379> ZINCRBY game:rank 5 102
"93"

# 再次查看排行榜
127.0.0.1:6379> ZREVRANGE game:rank 0 2 WITHSCORES
1) "103"
2) "100"
3) "101"
4) "95"
5) "102"
6) "93"

1.3.5 场景5:分布式会话

在分布式系统中,多台服务器之间无法共享本地会话(如Tomcat的Session),导致用户登录后切换服务器会重新登录。此时可将会话数据存储到Redis中,实现分布式会话共享。

实现思路

  • 用户登录成功后,生成唯一会话ID(如UUID);

  • 将会话数据(用户ID、用户名、权限等)存入Redis,设置会话过期时间(如30分钟);

  • 将会话ID写入用户浏览器Cookie;

  • 用户后续请求时,浏览器携带Cookie中的会话ID,服务器从Redis中查询会话数据,验证登录状态。

代码示例(Java + Spring Session集成,简化版)

实际开发中,可直接使用Spring Session集成Redis,无需手动操作Redis:

xml

<!-- pom.xml引入依赖 -->
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
java

// 配置类:开启Redis会话共享
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

// 会话过期时间:30分钟(60*30秒)
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60 * 30)
@Configuration
public class RedisSessionConfig {
}

配置完成后,Spring会自动将Session数据存储到Redis中,实现分布式会话共享。

1.4 主流数据库对比:Redis与MySQL、MongoDB的差异与适配场景

很多新手会有疑问:“Redis这么强,能替代MySQL吗?”答案是:不能。每种数据库都有其设计定位和适配场景,Redis、MySQL、MongoDB三者不是竞争关系,而是互补关系。下面通过对比,帮大家理清它们的适用边界。

1.4.1 核心维度对比

对比维度RedisMySQLMongoDB
数据库类型非关系型(NoSQL)、内存型关系型(SQL)、磁盘型非关系型(NoSQL)、文档型、磁盘型
数据模型键值对、多种数据结构(String、Hash等)表结构、行/列、支持关系(主键/外键)BSON文档(类似JSON,支持嵌套)
存储介质主要内存,支持持久化到磁盘磁盘(InnoDB支持缓冲池,缓存热点数据)磁盘,支持内存映射
核心优势高性能、高并发、支持复杂数据结构事务一致性(ACID)、支持复杂查询(JOIN、索引)灵活的文档模型、适合存储非结构化/半结构化数据
核心劣势存储容量有限(受内存限制)、不支持复杂查询高并发场景性能较弱、分库分表复杂度高事务支持较弱(仅支持单文档事务)、不支持JOIN查询
适用场景缓存、计数器、消息队列、排行榜、分布式会话核心业务数据(订单、用户、商品)、需要事务和复杂查询的场景日志数据、用户画像、内容管理(文章、评论)、物联网数据

1.4.2 实际项目中的协同示例

在电商项目中,三者常协同工作:

  1. Redis:缓存商品详情、用户会话、秒杀库存计数器、订单支付状态;

  2. MySQL:存储订单信息、用户基本信息、商品核心数据(价格、库存基数);

  3. MongoDB:存储商品评论(半结构化数据,支持嵌套回复)、用户行为日志(非结构化数据)。

总结:选择数据库的核心原则是“适配业务场景”,而非“追求技术先进性”。Redis的定位是“高性能辅助工具”,无法替代MySQL的核心数据存储作用。

1.5 Redis的发展历程与版本迭代:从1.0到7.x的核心演进

了解Redis的发展历程,能帮助我们更好地理解其设计理念的演进,也能明确不同版本的特性差异(避免在旧版本中使用不存在的功能)。下面梳理Redis从诞生到最新版本的核心节点:

1.5.1 关键版本迭代与核心特性

  • 2009年:Redis 1.0 正式发布,支持String、List、Set、Sorted Set四种基础数据结构,奠定了核心功能;

  • 2010年:Redis 2.0 发布,引入主从复制功能,提升了可用性;

  • 2012年:Redis 2.6 发布,支持AOF持久化的重写功能,优化了持久化性能;

  • 2013年:Redis 2.8 发布,引入哨兵(Sentinel)机制,实现主节点故障自动切换;

  • 2015年:Redis 3.0 发布,支持Redis Cluster集群功能,解决了分布式部署和分片问题;

  • 2018年:Redis 4.0 发布,引入混合持久化(RDB+AOF)、Redis Module(支持扩展功能);

  • 2019年:Redis 5.0 发布,引入Stream数据结构(支持可靠消息队列)、新的持久化格式;

  • 2021年:Redis 6.0 发布,引入多线程IO(提升网络处理能力)、TLS加密、ACLs权限控制;

  • 2022年:Redis 7.0 发布,优化了性能、支持多键命令的集群分片路由、引入RLUA脚本优化。

1.5.2 版本选择建议

对于生产环境,建议选择稳定版,避免使用最新版本(可能存在未知bug):

  • 若需使用Cluster集群、Stream等功能,建议选择 Redis 6.2.x(稳定版,应用广泛);

  • 若追求更新的特性(如多键分片路由),可选择 Redis 7.0.x(已发布稳定版,经过验证);

  • 避免使用Redis 3.x及以下旧版本,存在性能和安全隐患。

版本下载地址:Redis官方下载页,可选择源码包或预编译包。

1.6 学习Redis的准备工作:环境、工具与学习方法

工欲善其事,必先利其器。在正式学习Redis之前,我们需要搭建好学习环境、准备好常用工具,并掌握科学的学习方法。本节内容实用性极强,直接关系到后续学习效率。

1.6.1 环境搭建:本地环境与Docker环境

Redis支持Windows和Linux系统,推荐在Linux(或Mac)环境学习(生产环境均为Linux)。下面提供两种搭建方式,新手推荐Docker方式(简单快捷,无需配置依赖)。

方式1:Docker快速搭建(推荐)

前提:已安装Docker(Docker安装教程:Docker官方文档)。

bash

# 1. 拉取Redis 6.2.6镜像(稳定版)
docker pull redis:6.2.6

# 2. 启动Redis容器(映射端口6379,设置密码123456,挂载数据卷)
docker run -d \
  --name redis-learn \
  -p 6379:6379 \
  -v redis-data:/data \
  redis:6.2.6 \
  redis-server --requirepass "123456"

# 3. 查看容器是否启动成功
docker ps | grep redis-learn

# 4. 进入Redis容器,使用redis-cli连接
docker exec -it redis-learn redis-cli -a 123456

# 连接成功后,测试命令
127.0.0.1:6379> SET hello redis
OK
127.0.0.1:6379> GET hello
"redis"

参数说明:

  • -d:后台运行容器;

  • -p 6379:6379:将容器的6379端口映射到本地6379端口;

  • -v redis-data:/data:挂载数据卷,避免容器删除后数据丢失;

  • --requirepass "123456":设置Redis密码(生产环境必须设置)。

方式2:Linux源码编译安装(进阶)

适合想深入了解Redis安装过程的同学:

bash

# 1. 安装依赖(gcc)
yum install -y gcc gcc-c++

# 2. 下载Redis 6.2.6源码包
wget https://download.redis.io/releases/redis-6.2.6.tar.gz

# 3. 解压源码包
tar -zxvf redis-6.2.6.tar.gz

# 4. 进入源码目录,编译安装
cd redis-6.2.6
make && make install PREFIX=/usr/local/redis

# 5. 复制配置文件到安装目录
cp redis.conf /usr/local/redis/bin/

# 6. 修改配置文件(允许远程连接、设置密码)
vi /usr/local/redis/bin/redis.conf
# 找到并修改以下参数:
# bind 127.0.0.1 → 注释掉(允许远程连接)
# protected-mode yes → no(关闭保护模式)
# requirepass foobared → requirepass 123456(设置密码)

# 7. 启动Redis
cd /usr/local/redis/bin
./redis-server redis.conf

# 8. 连接Redis
./redis-cli -a 123456

1.6.2 常用工具推荐

1. 客户端工具

  • redis-cli:官方命令行客户端,功能全面,适合日常开发和运维(必须掌握);

  • Redis Desktop Manager(RDM):可视化客户端,支持Windows/Mac/Linux,界面友好,适合查看数据结构、调试功能(下载地址:RDM官方下载);

  • Another Redis Desktop Manager:开源免费的可视化客户端,轻量高效,替代RDM(下载地址:GitHub地址)。

2. 开发客户端库

不同编程语言对应的Redis客户端:

  • Java:Jedis(简单轻量)、Lettuce(线程安全,Spring Boot默认集成);

  • Python:redis-py(官方推荐,简单易用);

  • Go:redigo、go-redis(功能强大,支持集群);

  • Node.js:ioredis(性能优异,支持Promise)。

3. 监控与运维工具

  • redis-cli info:查看Redis运行状态(内存、CPU、连接数等);

  • Prometheus + Grafana:开源监控组合,可绘制Redis各项指标的可视化图表(后续第15章详细讲解);

  • RedisInsight:Redis官方监控工具,支持可视化监控、性能分析(下载地址:官方地址)。

1.6.3 科学的学习方法

Redis的学习难度适中,但涉及的知识点较多(基础命令、数据结构、持久化、集群、运维等),建议采用“理论+实操+项目”的学习路径:

  1. 阶段1:基础命令与数据结构(第2-4章):先掌握每种数据结构的核心命令,通过redis-cli反复实操,理解不同结构的适用场景;

  2. 阶段2:核心原理(第5-8章):深入学习持久化、内存管理、事务等核心机制,理解Redis“为什么能这么快”“如何保证数据安全”;

  3. 阶段3:实战应用(第9-12章):结合实际业务场景(缓存、队列、分布式会话),通过代码实现功能,解决实际问题;

  4. 阶段4:集群与运维(第13-16章):学习集群搭建、高可用保障、监控优化,掌握生产环境的Redis运维技巧;

  5. 阶段5:项目实战:将Redis集成到完整项目中(如电商秒杀系统),综合运用所学知识。

补充建议:

  • 多查看官方文档(Redis官方文档),官方文档是最权威、最全面的学习资料;

  • 遇到问题先尝试自己排查(查看日志、使用redis-cli info命令),培养解决问题的能力;

  • 关注Redis社区动态,了解新版本特性和最佳实践。

本章小结

本章作为Redis入门的开篇,我们从“是什么、有什么特性、能解决什么问题、和其他数据库的区别、如何学习”五个维度,建立了对Redis的整体认知。核心要点总结如下:

  • Redis是内存数据结构存储,核心优势是高性能、高可用、支持多种灵活的数据结构;

  • Redis的典型应用场景包括缓存、计数器、消息队列、排行榜、分布式会话等;

  • Redis不能替代MySQL、MongoDB,三者在项目中协同工作,适配不同场景;

  • 学习Redis需先搭建好环境,掌握常用工具,遵循“理论+实操+项目”的学习路径。

下一章,我们将深入学习Redis的环境搭建细节和基础命令,正式开启Redis的实操之旅。如果本章内容有疑问,欢迎在评论区留言讨论~

热爱生活,喜好美食,追求未来!