🎯 本文适合人群:零基础小白、后端开发新手、准备面试的同学
⏱️ 阅读时长:15分钟
📌 你将收获:理解 Redis 是什么、为什么用它、如何在 CentOS 上完整安装配置


📖 目录


一、Redis 是什么?

1.1 官方定义

Redis(Remote Dictionary Server,远程字典服务器)是一个开源的、基于内存键值对(Key-Value)数据库

1.2 通俗理解

💡 打个比方

  • MySQL 像一个图书馆,书籍(数据)都放在书架(磁盘)上,查找需要时间
  • Redis 像你的书桌,常用的书(热点数据)直接放桌上,拿取超快
┌─────────────────────────────────────────┐
│         应用程序(你的代码)               │
└─────────────────────────────────────────┘
                  ↓
    ┌─────────────────────────┐
    │   Redis(内存,超快)     │  ← 热点数据,毫秒级响应
    └─────────────────────────┘
                  ↓
    ┌─────────────────────────┐
    │   MySQL(磁盘,较慢)     │  ← 全量数据,持久化存储
    └─────────────────────────┘

1.3 核心特点

特点 说明 通俗理解
内存存储 数据存在 RAM 中 就像把文件放在电脑内存里,而不是硬盘里
键值对 Key-Value 结构 像 Python 的字典 {"name": "张三"}
高性能 QPS 可达 10万+ 每秒可以处理 10 万次请求
数据结构丰富 支持 String、List、Set 等 不只是简单的字符串,还有列表、集合等
持久化 可以保存到磁盘 断电后数据不会丢失(需配置)
单线程 命令执行是单线程 避免了多线程的锁竞争问题

二、为什么要用 Redis?

2.1 解决数据库性能瓶颈

问题场景:电商网站首页,每天 100 万用户访问,每次都查 MySQL

// ❌ 没有缓存:每次都查数据库
public List<Product> getHotProducts() {
    // 每次查询耗时 200ms,数据库压力巨大
    return productDao.queryHotProducts();
}
// ✅ 使用 Redis 缓存
public List<Product> getHotProducts() {
    // 1. 先查 Redis(耗时 1ms)
    List<Product> products = redisTemplate.get("hot:products");
    
    if (products == null) {
        // 2. Redis 没有,再查数据库
        products = productDao.queryHotProducts();
        
        // 3. 存入 Redis,下次直接用
        redisTemplate.set("hot:products", products, 3600); // 缓存1小时
    }
    
    return products;
}

效果对比

方案 每次查询耗时 数据库 QPS 服务器压力
无缓存 200ms 5000/秒 💀 爆炸
Redis 缓存 1ms 50/秒 😊 轻松

2.2 Redis vs 其他缓存方案

┌──────────────────────────────────────────────┐
│  缓存方案对比                                 │
├──────────────────────────────────────────────┤
│  1. 本地缓存(HashMap)                       │
│     ✅ 速度最快                               │
│     ❌ 无法共享(多台服务器数据不一致)         │
│     ❌ 内存限制(受单机内存约束)              │
│                                              │
│  2. Memcached                                │
│     ✅ 性能好                                 │
│     ❌ 只支持 String                          │
│     ❌ 不支持持久化                           │
│                                              │
│  3. Redis ⭐推荐                             │
│     ✅ 数据结构丰富                           │
│     ✅ 支持持久化                             │
│     ✅ 支持集群                               │
│     ✅ 功能强大(发布订阅、事务等)             │
└──────────────────────────────────────────────┘

三、Redis 的应用场景

3.1 缓存(最常用)

// 场景:用户信息缓存
// Key: "user:1001"
// Value: {"id":1001,"name":"张三","age":25}
// 过期时间:30分钟

真实案例

  • 微博热搜榜(每分钟更新)
  • 电商商品详情(库存、价格)
  • 新闻 APP 首页文章列表

3.2 分布式锁

// 场景:秒杀活动,防止超卖
public boolean seckill(Long productId, Long userId) {
    String lockKey = "lock:product:" + productId;
    
    // 获取分布式锁(只有一个请求能成功)
    boolean lock = redisTemplate.setIfAbsent(lockKey, userId.toString(), 10, TimeUnit.SECONDS);
    
    if (lock) {
        try {
            // 执行秒杀逻辑
            return doSeckill(productId, userId);
        } finally {
            // 释放锁
            redisTemplate.delete(lockKey);
        }
    }
    
    return false; // 获取锁失败
}

3.3 计数器

// 场景:文章点赞数
// 用户每点一次赞,Redis +1
redisTemplate.increment("article:1001:likes"); // 点赞数 +1

// 获取总点赞数
Long likes = redisTemplate.get("article:1001:likes");

3.4 排行榜

// 场景:游戏积分排行榜(使用 ZSet 有序集合)
// 玩家得分
redisTemplate.zadd("rank:game", 9500, "玩家A");
redisTemplate.zadd("rank:game", 8800, "玩家B");
redisTemplate.zadd("rank:game", 9200, "玩家C");

// 获取前 10 名
Set<String> top10 = redisTemplate.zrevrange("rank:game", 0, 9);

3.5 消息队列

// 场景:订单通知(使用 List 列表)
// 生产者:添加订单到队列
redisTemplate.lpush("queue:order", "订单1001");

// 消费者:从队列取出订单
String order = redisTemplate.rpop("queue:order");

3.6 Session 共享

┌─────────────┐       ┌─────────────┐
│  用户登录    │       │   服务器A    │
│  Session 存  │───────▶│   Session   │
│   在哪里?   │       └─────────────┘
└─────────────┘              │
                             │ 下次请求到了服务器B
                             ▼
                    ┌─────────────┐
                    │   服务器B    │
                    │   找不到!    │ ❌ Session 丢失
                    └─────────────┘

────────────────────────────────────────────

使用 Redis 存储 Session

┌─────────────┐       ┌─────────────┐
│  用户登录    │       │   Redis     │  ← 所有服务器共享
│  Session    │───────▶│   Session   │
└─────────────┘       └─────────────┘
                             ▲
                ┌────────────┴────────────┐
                │                         │
         ┌─────────────┐          ┌─────────────┐
         │   服务器A    │          │   服务器B    │
         └─────────────┘          └─────────────┘
              ✅ 都能访问            ✅ 都能访问

四、CentOS 安装 Redis 完整教程

4.1 环境准备

# 查看系统版本
cat /etc/redhat-release
# CentOS Linux release 7.9.2009 (Core)

# 确保有 gcc 编译器(Redis 需要编译安装)
gcc --version

# 如果没有 gcc,先安装
sudo yum install -y gcc gcc-c++ make

4.2 方式一:yum 安装(推荐新手)

# 1. 安装 EPEL 仓库(Redis 在这个仓库里)
sudo yum install -y epel-release

# 2. 安装 Redis
sudo yum install -y redis

# 3. 查看版本
redis-server --version
# Redis server v=3.2.12 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=7897e7d0e13773f

# 4. 启动 Redis
sudo systemctl start redis

# 5. 设置开机自启
sudo systemctl enable redis

# 6. 查看状态
sudo systemctl status redis
# ● redis.service - Redis persistent key-value database
#    Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled)
#    Active: active (running) ✅

优点:简单快速,一键安装
缺点:版本较旧(3.2),无法安装最新版


4.3 方式二:源码编译安装(推荐进阶)

步骤 1:下载 Redis
# 1. 进入 /opt 目录(存放第三方软件)
cd /opt

# 2. 下载 Redis 7.0.15(截至 2024 年稳定版)
sudo wget https://download.redis.io/releases/redis-7.0.15.tar.gz

# 如果 wget 下载慢,可以用国内镜像
sudo wget https://mirrors.huaweicloud.com/redis/redis-7.0.15.tar.gz

# 3. 解压
sudo tar -zxvf redis-7.0.15.tar.gz

# 4. 进入目录
cd redis-7.0.15
步骤 2:编译安装
# 1. 编译(需要几分钟,耐心等待)
sudo make

# 如果报错 "zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file"
# 执行:sudo make MALLOC=libc

# 2. 安装到 /usr/local/bin(系统可执行文件目录)
sudo make install

# 3. 验证安装
redis-server --version
# Redis server v=7.0.15 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=123456789
步骤 3:配置 Redis
# 1. 创建配置文件目录
sudo mkdir -p /etc/redis

# 2. 创建数据目录
sudo mkdir -p /var/lib/redis

# 3. 创建日志目录
sudo mkdir -p /var/log/redis

# 4. 复制配置文件
sudo cp /opt/redis-7.0.15/redis.conf /etc/redis/redis.conf

# 5. 备份原配置
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
步骤 4:修改配置文件(重要)
# 编辑配置文件
sudo vim /etc/redis/redis.conf

关键配置项(按 / 搜索关键字):

# ========== 1. 后台运行 ==========
# 搜索 "daemonize"
daemonize yes  # 改为 yes(默认是 no)

# ========== 2. 绑定 IP ==========
# 搜索 "bind"
# bind 127.0.0.1  # 注释掉这行(加 # 号)
bind 0.0.0.0      # 允许所有 IP 访问(生产环境需配合防火墙)

# ========== 3. 端口 ==========
# 搜索 "port"
port 6379  # 默认端口,可以不改

# ========== 4. 密码(强烈建议设置)==========
# 搜索 "requirepass"
requirepass your_strong_password_123  # 设置密码

# ========== 5. 数据目录 ==========
# 搜索 "dir"
dir /var/lib/redis  # 数据存储目录

# ========== 6. 日志文件 ==========
# 搜索 "logfile"
logfile /var/log/redis/redis.log

# ========== 7. 持久化(RDB)==========
# 搜索 "save"
save 900 1      # 900秒内有1次修改,触发保存
save 300 10     # 300秒内有10次修改,触发保存
save 60 10000   # 60秒内有10000次修改,触发保存

# ========== 8. 最大内存(可选)==========
# 搜索 "maxmemory"
maxmemory 2gb   # 限制最大使用 2GB 内存

# 内存淘汰策略
maxmemory-policy allkeys-lru  # 内存满时,删除最少使用的 key

配置说明

配置项 作用 推荐值
daemonize 是否后台运行 yes
bind 允许哪些 IP 连接 0.0.0.0(所有)或 内网IP
port 端口号 6379
requirepass 密码 必须设置
dir 数据目录 /var/lib/redis
logfile 日志文件 /var/log/redis/redis.log
步骤 5:创建系统服务
# 创建服务文件
sudo vim /etc/systemd/system/redis.service

复制以下内容

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
User=redis
Group=redis

[Install]
WantedBy=multi-user.target
# 创建 redis 用户(安全考虑)
sudo useradd -r -s /sbin/nologin redis

# 修改目录权限
sudo chown -R redis:redis /var/lib/redis
sudo chown -R redis:redis /var/log/redis

# 重载系统服务
sudo systemctl daemon-reload

# 启动 Redis
sudo systemctl start redis

# 设置开机自启
sudo systemctl enable redis

# 查看状态
sudo systemctl status redis
步骤 6:测试连接
# 1. 本地连接(需要输入密码)
redis-cli

# 2. 输入密码
127.0.0.1:6379> auth your_strong_password_123
OK

# 3. 测试命令
127.0.0.1:6379> ping
PONG  # ✅ 连接成功

# 4. 设置一个值
127.0.0.1:6379> set name "小明"
OK

# 5. 获取值
127.0.0.1:6379> get name
"小明"

# 6. 查看所有 key
127.0.0.1:6379> keys *
1) "name"

# 7. 退出
127.0.0.1:6379> quit

4.4 防火墙配置

# 方式1:开放 6379 端口
sudo firewall-cmd --zone=public --add-port=6379/tcp --permanent
sudo firewall-cmd --reload

# 方式2:关闭防火墙(仅测试环境)
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# 查看端口是否开放
sudo firewall-cmd --list-ports
# 6379/tcp  ✅

4.5 远程连接测试

# 在另一台机器上测试
redis-cli -h 192.168.1.100 -p 6379 -a your_strong_password_123

# 或者
redis-cli -h 192.168.1.100 -p 6379
192.168.1.100:6379> auth your_strong_password_123
OK

可视化工具推荐

  • Redis Desktop Manager(免费,跨平台)
  • Another Redis Desktop Manager(开源)
  • RedisInsight(官方工具)

五、Redis 配置详解

5.1 核心配置项速查表

配置项 默认值 说明 示例
bind 127.0.0.1 监听的 IP 地址 bind 0.0.0.0
port 6379 监听端口 port 6379
daemonize no 是否后台运行 daemonize yes
requirepass 密码 requirepass 123456
timeout 0 客户端闲置超时时间(秒) timeout 300
databases 16 数据库数量 databases 16
maxclients 10000 最大客户端连接数 maxclients 10000
maxmemory 0(无限制) 最大内存 maxmemory 2gb
maxmemory-policy noeviction 内存淘汰策略 maxmemory-policy allkeys-lru

5.2 内存淘汰策略详解

当 Redis 内存达到 maxmemory 限制时,会按照策略删除数据:

策略 说明 适用场景
noeviction 不淘汰,写入报错 不推荐
allkeys-lru 从所有 key 中删除最少使用的 ⭐ 推荐(通用缓存)
allkeys-lfu 从所有 key 中删除最不常用的 热点数据缓存
volatile-lru 从设置了过期时间的 key 中删除最少使用的 混合场景
volatile-ttl 删除即将过期的 key 特殊场景
allkeys-random 随机删除 不推荐
# 示例:设置 LRU 策略
maxmemory 2gb
maxmemory-policy allkeys-lru

六、常见面试题

6.1 基础概念题

Q1:Redis 为什么这么快?

答案

  1. 纯内存操作:数据存在 RAM 中,访问速度纳秒级
  2. 单线程模型:避免了线程切换和锁竞争的开销
  3. IO 多路复用:使用 epoll/kqueue,高效处理并发连接
  4. 高效的数据结构:针对不同场景优化(如跳表、压缩列表)
  5. 优化的底层实现:C 语言编写,性能极致
Q2:Redis 是单线程还是多线程?

答案

  • Redis 6.0 之前:完全单线程(命令执行、网络 IO)
  • Redis 6.0 之后
    • 命令执行:仍是单线程(保证原子性)
    • 网络 IO:引入多线程(提高并发)
    • 持久化、异步删除:独立线程
┌─────────────────────────────────────┐
│        Redis 6.0+ 线程模型          │
├─────────────────────────────────────┤
│  网络 IO 线程池(多线程)            │
│    ↓                                │
│  命令执行(单线程)  ← 核心!        │
│    ↓                                │
│  持久化线程(独立线程)              │
└─────────────────────────────────────┘
Q3:Redis 和 Memcached 的区别?
对比项 Redis Memcached
数据类型 String、List、Set、ZSet、Hash 只支持 String
持久化 支持(RDB、AOF) 不支持
集群 支持(哨兵、Cluster) 通过客户端实现
线程模型 单线程(6.0后IO多线程) 多线程
过期策略 惰性删除 + 定期删除 惰性删除
应用场景 缓存、消息队列、排行榜等 纯缓存
Q4:为什么 Redis 单线程还能支持高并发?

答案

  1. CPU 不是瓶颈:Redis 的瓶颈是内存和网络,而不是 CPU
  2. 避免上下文切换:单线程无需切换,效率更高
  3. IO 多路复用:一个线程可以同时监听多个客户端连接
传统多线程:
┌─────┐ ┌─────┐ ┌─────┐
│线程1│ │线程2│ │线程3│  ← 需要切换、加锁
└─────┘ └─────┘ └─────┘

Redis 单线程 + IO 多路复用:
┌───────────────────────────┐
│   一个线程监听 1000 个连接  │  ← 无需切换
└───────────────────────────┘

6.2 安装配置题

Q5:如何设置 Redis 开机自启?

答案

# CentOS 7+
sudo systemctl enable redis

# 查看是否设置成功
sudo systemctl is-enabled redis
# enabled ✅
Q6:如何查看 Redis 的配置?

答案

# 方式1:查看配置文件
cat /etc/redis/redis.conf | grep -v "^#" | grep -v "^$"

# 方式2:在 redis-cli 中查看
redis-cli
127.0.0.1:6379> CONFIG GET *  # 查看所有配置
127.0.0.1:6379> CONFIG GET maxmemory  # 查看单个配置
Q7:如何动态修改 Redis 配置(无需重启)?

答案

# 在 redis-cli 中执行
127.0.0.1:6379> CONFIG SET maxmemory 4gb
OK

# 持久化配置(否则重启后失效)
127.0.0.1:6379> CONFIG REWRITE
OK

6.3 实战问题

Q8:Redis 内存占用过高怎么办?

答案

  1. 设置内存限制

    maxmemory 2gb
    maxmemory-policy allkeys-lru
    
  2. 分析大 key

    # 查找大 key
    redis-cli --bigkeys
    
  3. 设置过期时间

    SET key value EX 3600  # 1小时后过期
    
  4. 清理无用数据

    # 删除匹配的 key
    redis-cli KEYS "temp:*" | xargs redis-cli DEL
    
Q9:如何保证 Redis 的安全性?

答案

  1. 设置密码

    requirepass strong_password
    
  2. 限制访问 IP

    bind 127.0.0.1 192.168.1.100
    
  3. 禁用危险命令

    rename-command FLUSHDB ""
    rename-command FLUSHALL ""
    rename-command KEYS ""
    
  4. 使用防火墙

    sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="6379" protocol="tcp" accept' --permanent
    
  5. 定期备份

    # 手动备份
    redis-cli BGSAVE
    
Q10:Redis 启动失败怎么排查?

答案

  1. 查看日志

    tail -f /var/log/redis/redis.log
    
  2. 检查端口占用

    netstat -nltp | grep 6379
    
  3. 检查配置文件

    redis-server /etc/redis/redis.conf --test-config
    
  4. 检查权限

    ls -l /var/lib/redis
    # 确保 redis 用户有读写权限
    

🎉 总结

本文涵盖了 Redis 从入门到安装的完整流程:

理解 Redis:内存数据库、高性能、键值对存储
应用场景:缓存、分布式锁、计数器、排行榜、消息队列
安装方式:yum 快速安装、源码编译安装
配置优化:密码、内存限制、持久化、淘汰策略
面试宝典:10 道高频面试题


📚 下一篇预告

《Redis 基础命令速通:小白上手必学的常用操作》

将详细讲解:

  • Redis 五大数据类型的命令
  • 键操作、过期设置
  • 实战案例演示
  • 命令速查表

💬 互动时间
你在安装 Redis 时遇到过什么问题?欢迎评论区留言!
👍 觉得有帮助,点个赞再走吧~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐