从零起步学习Redis || 第一章:认识与配置Redis

0 阅读9分钟

前言:解锁Java后端性能的密钥——Redis入门指南

作为Java后端开发者,你是否曾面临这样的困境?

  • 高并发请求下数据库频频告急,接口响应越来越慢
  • 需要实现实时排行榜或秒杀计数,SQL语句却越发臃肿
  • 会话数据存储在Tomcat内存,集群部署时用户频繁掉线

这正是指向Redis的路标——这个看似简单的键值存储,已成为现代后端架构的性能加速引擎。当我初次接触Redis时,它用0.1毫秒的响应速度彻底颠覆了我对数据操作的认知:原来百万级的QPS并非遥不可及!

这正是指向Redis的路标——这个看似简单的键值存储,已成为现代后端架构的性能加速引擎。当我初次接触Redis时,它用0.1毫秒的响应速度彻底颠覆了我对数据操作的认知:原来百万级的QPS并非遥不可及!

image.png

一、Redis 是什么数据库?

  1. 核心定义: Redis (Remote Dictionary Server) 是一个开源的、内存中 (In-Memory) 的 键值对 (Key-Value) 存储 系统。它常被称为 数据结构服务器 (Data Structure Server)

  2. 特性概述:

    • 内存存储: 这是 Redis 性能极致 (读写速度可达微秒级) 的根本原因。所有数据主要保存在内存中。

    • 数据结构丰富: 不仅仅是简单的字符串键值对。它支持:

      • String: 最基本类型,可以包含任何数据。
      • List: 字符串列表,按插入顺序排序,支持双向操作(栈/队列)。
      • Set: 无序的、唯一的字符串集合。
      • Sorted Set (ZSet): 有序的、唯一的字符串集合,每个元素关联一个分数(score)用于排序。
      • Hash: 键值对集合,非常适合存储对象(如用户信息:user:1000 -> {name:"Alice", age:30, email:"..."})。
      • Bitmaps: 位操作。
      • HyperLogLog: 高效估算集合基数(唯一元素个数)。
      • Geospatial: 地理位置坐标存储与查询(如附近的人)。
      • Stream: 用于构建消息传递和流处理应用。
    • 持久化: 为避免内存数据丢失,Redis 提供两种主要的持久化机制将数据异步写入磁盘:

      • RDB (Redis Database File) : 在指定时间间隔生成整个数据库的快照。
      • AOF (Append Only File) : 记录服务器收到的所有写操作命令,并在重启时重新执行以恢复数据。通常更安全,但文件更大。
    • 主从复制 (Replication): 支持主节点(Master)向多个从节点(Slave)异步复制数据,用于数据冗余、读写分离(读请求可以分发到从节点)和高可用基础。

    • 高可用与分片 (High Availability & Sharding): 通过官方解决方案 Redis Sentinel 实现自动故障转移;通过 Redis Cluster 实现数据自动分片(Sharding)和分区容忍性,支持大规模数据集和更高吞吐量。

    • 原子操作: Redis 是单线程处理命令(最新版核心网络模型优化过,但命令执行仍是单线程),其提供的丰富数据结构和操作(如INCRHSETLPUSHSADDZADD等)都是原子的,非常适合实现计数器、排行榜等功能。

    • 发布/订阅 (Pub/Sub): 提供简单的消息传递模式。

一句话总结

Redis 是一个超快、支持多种高级数据结构、可配置持久化、支持主从复制和集群的内存键值数据库,常被用作缓存、消息中间件、实时数据处理存储等。

二、Redis vs MySQL (或其他关系型数据库 RDBMS)

理解 Redis 和 MySQL 的区别至关重要,它们解决不同的问题,通常互补使用,而不是互相替代。Java 后端开发中,两者结合非常常见(如 Redis 作 MySQL 的缓存层)。

特性RedisMySQL (关系型数据库代表)
数据模型键值对 (Key-Value) + 丰富数据结构关系型 (Relational) :表、行、列、模式(Schema)
存储位置主要在内存 (RAM) ,持久化到磁盘可配置主要在磁盘 (SSD/HDD) ,利用内存缓存(Buffer Pool)
查询语言专属命令 (SETGETHSETZADD等)SQL (结构化查询语言) (SELECTINSERTUPDATEJOIN等)
性能极高 (读写通常在微秒级) - 内存访问优势 (尤其是读),但磁盘 I/O 是瓶颈,复杂查询更耗时
数据规模受限于内存大小 (虽然 Cluster 可扩展)理论上非常大,磁盘空间远大于内存
持久化可选 (RDB快照 / AOF日志)强持久化保证 (通常是 ACID 的一部分)
事务支持简单事务 (MULTI/EXEC),非严格 ACID支持完整 ACID 事务 (原子性、一致性、隔离性、持久性)
数据结构极其丰富 (String, List, Set, ZSet, Hash等)相对固定 (主要就是表结构和数据类型)
复杂查询非常有限 (主要是键查找和简单范围查询)非常强大 (JOIN, 复杂 WHERE, 聚合函数, 子查询等)
模式 (Schema)无模式 (Schema-less) - 灵活性高强模式 (Schema) - 需要预先定义表结构
主要用途缓存、会话存储、排行榜/计数器、消息队列(Pub/Sub)、实时分析、高速读写场景持久化存储、需要复杂查询/事务/关系建模的业务数据存储、报表分析
扩展性水平扩展 (分片) 相对容易 (Redis Cluster)水平扩展 (分库分表) 较复杂;垂直扩展常见

核心区别总结

  1. 内存 vs 磁盘: Redis 超快但数据规模受限于内存成本;MySQL 数据规模大但性能相对慢。
  2. 数据结构 vs 关系/SQL: Redis 提供灵活高效的数据结构操作但不支持复杂关系查询(如 JOIN);MySQL 擅长复杂关系查询和事务。
  3. 用途: Redis 常用于 缓存、高速临时数据和特定数据结构需求;MySQL 用于 核心业务数据的持久化存储
  4. 互补: 在现代架构中,最常见的是用 Redis 作为 MySQL 的缓存层。热数据放 Redis 加速访问,全量/冷数据在 MySQL。

三、安装和配置 Redis (Windows & macOS/Linux)

强烈建议:使用 WSL (Windows 用户最佳体验)

对于 Windows 用户,强烈推荐通过 Windows Subsystem for Linux (WSL) 安装 Redis。这是目前官方支持和维护的方式,性能更好,兼容性更佳,也符合生产环境部署习惯(Linux)。

  1. 启用 WSL:

    • 以管理员身份打开 PowerShell 或 Windows 命令提示符。
    • 运行 wsl --install。这会安装默认的 Linux 发行版(通常是 Ubuntu)。按照提示重启计算机。
    • 重启后,WSL 安装将继续,并提示你创建 Linux 用户名和密码。
  2. 打开 WSL (Ubuntu): 在 Windows 搜索栏中输入 Ubuntu 并打开终端。

  3. 更新包列表: sudo apt update

  4. 安装 Redis: sudo apt install redis-server

  5. 启动 Redis 服务: sudo service redis-server start

  6. 验证安装 & 连接客户端:

    • redis-cli 这会连接到本地的 Redis 服务器 (127.0.0.1:6379).

    • 在 redis-cli 提示符下输入 ping,如果返回 PONG,说明安装成功并能连接!🥳

    • 尝试一些命令:

      • SET mykey "Hello Redis!"
      • GET mykey (应该返回 "Hello Redis!")
      • EXIT 退出客户端。
  7. 设置开机自启 (可选): sudo systemctl enable redis-server

直接安装 (macOS / Linux)

  1. macOS (使用 Homebrew):

    • 安装 Homebrew (如果未安装): /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    • 安装 Redis: brew install redis
    • 启动 Redis (后台): brew services start redis
    • 连接客户端: redis-cli
    • 验证 ping -> PONG
  2. Linux (Debian/Ubuntu):

    • 更新包列表: sudo apt update
    • 安装 Redis: sudo apt install redis-server
    • 启动服务: sudo systemctl start redis-server
    • 设置开机启动 (可选): sudo systemctl enable redis-server
    • 连接客户端: redis-cli
    • 验证 ping -> PONG

纯 Windows 安装 (不推荐,仅作备选)

  1. 下载: 访问微软维护的 Redis for Windows 旧版本分支 (质量层次不齐,官方不积极维护):github.com/microsoftar… - 选择最新的 Redis-x64-*.msi 安装包。

  2. 安装: 双击 .msi 文件运行安装向导。建议勾选 “Add the Redis installation folder to the PATH environment variable” 以便在命令行中使用 redis-cli

  3. 运行服务:

    • 方法1 (服务方式): 安装程序默认会将 Redis 注册为 Windows 服务。可在 “服务” 应用 (services.msc) 中找到 Redis 服务并启动它(通常安装后已自动启动)。
    • 方法2 (命令行): 打开命令提示符,导航到 Redis 安装目录 (如 C:\Program Files\Redis),运行 redis-server.exe redis.windows.conf
  4. 连接客户端:

    • 打开新的命令提示符。
    • 输入 redis-cli.exe
    • 验证 ping -> PONG

运行Redis(根据自己情况适时调整)

点击这里启动Rediis服务

image.png

然后会弹出页面

转存失败,建议直接上传图片文件​编辑

在客户端打开即可进入页面

转存失败,建议直接上传图片文件​编辑

四、Java 中使用 Redis - 快速入门

​​

你需要一个 Redis 的 Java 客户端库。最流行的两个是:

  1. Jedis: 简单直接,同步阻塞式客户端,历史悠久,社区成熟。
  2. Lettuce: 基于 Netty 的异步非阻塞式客户端,支持响应式编程模型,通常性能更好,功能更现代。Spring Boot 2.x+ 默认集成 Lettuce。

以 Lettuce 为例 (Spring Boot Starter Data Redis 集成)

  1. 添加依赖 (Maven - pom.xml):
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!-- Lettuce 核心依赖会自动引入 -->

转存失败,建议直接上传图片文件

  1. 配置 Redis 连接 (application.propertiesapplication.yml):
    # 地址和端口 (默认 6379)
    spring.redis.host=localhost
    spring.redis.port=6379
    # 如果设置了密码 (默认空)
    spring.redis.password=yourpassword # 通常你在安装时还没设密码,可以省略
    # 连接池配置根据需要调整
    spring.redis.lettuce.pool.max-active=8
    spring.redis.lettuce.pool.max-idle=8
    spring.redis.lettuce.pool.min-idle=0

转存失败,建议直接上传图片文件

  1. 使用 RedisTemplate 或 StringRedisTemplate (Spring 封装):
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Component;

    @Component
    public class SimpleRedisExample {

        @Autowired
        private StringRedisTemplate stringRedisTemplate; // 专门处理 String 类型键值对(key-value都是字符串)

        public void doSomething() {
            // 存储 String
            stringRedisTemplate.opsForValue().set("greeting", "Hello from Spring Redis!");

            // 读取 String
            String value = stringRedisTemplate.opsForValue().get("greeting");
            System.out.println(value); // 输出: Hello from Spring Redis!

            // 存储 Hash (模拟一个对象 User)
            stringRedisTemplate.opsForHash().put("user:1000", "name", "Alice");
            stringRedisTemplate.opsForHash().put("user:1000", "email", "alice@example.com");

            // 获取 Hash 字段
            String name = (String) stringRedisTemplate.opsForHash().get("user:1000", "name");
            System.out.println(name); // 输出: Alice

            // 操作 List
            stringRedisTemplate.opsForList().leftPush("mylist", "item1");
            stringRedisTemplate.opsForList().leftPush("mylist", "item2");
            String firstItem = stringRedisTemplate.opsForList().index("mylist", 0);
            System.out.println(firstItem); // 输出: item2 (因为是左推)

            // 设置过期时间 (秒)
            stringRedisTemplate.expire("greeting", 60, TimeUnit.SECONDS);
        }
    }

转存失败,建议直接上传图片文件

五、重要的安全提示 (本地开发也请注意)

  • 默认无密码: 安装后的 Redis 默认没有密码且绑定 127.0.0.1 (只允许本地访问)。这在本地开发通常安全。

  • 生产环境必须配置:

    • 设置强密码: 在配置文件 redis.conf 中设置 requirepass your_strong_password
    • 绑定 IP: 如果外部需要访问,谨慎绑定 IP (bind 127.0.0.1 your_server_ip),或者使用防火墙规则限制访问 IP。
    • 修改默认端口: 修改 port 6379 为一个不常见的端口。
    • 禁用高危命令: 使用 rename-command CONFIG "" 和 rename-command FLUSHALL "" 等禁用或重命名危险命令。