什么是 Redis?

Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对存储系统。它通常被归类为一种 NoSQL 数据库,也被称为数据结构服务器,因为它不仅支持简单的字符串键值对,还支持复杂的数据结构,如列表、集合、哈希、有序集合等。

核心特性:

  1. 基于内存:数据主要存储在内存中,这使得读写速度极快(通常达到微秒级别)。
  2. 持久化:虽然数据在内存中,但 Redis 提供了两种持久化机制(RDB 和 AOF)将数据写入磁盘,防止数据丢失。
  3. 丰富的数据结构:这是 Redis 区别于其他简单键值存储的关键。它支持 Strings, Hashes, Lists, Sets, Sorted Sets, Bitmaps 等。
  4. 高性能:单线程架构(核心网络模型和键值对读写是单线程)避免了多线程的上下文切换和竞争问题,加上基于内存的操作,使其性能极高。
  5. 原子操作:所有单个命令的执行都是原子的,这得益于其单线程模型。对于多个命令,可以使用 Lua 脚本或事务来保证原子性。
  6. 发布/订阅:支持消息的发布和订阅模式,可用于简单的消息队列场景。
  7. 高可用和分布式:通过 Redis Sentinel 提供高可用性(故障转移),通过 Redis Cluster 提供分布式数据分片。

完整发展流程

Redis 的发展历程是其从一个个人项目成长为互联网基础设施核心组件的过程。

  1. 诞生 (2009)

    • 由意大利程序员 Salvatore Sanfilippo(网名 antirez)创建,以解决其创业公司 LLOOGG 的实时日志分析性能问题。
    • 初衷是创建一个持久化的、支持多种数据结构的键值数据库。
  2. 早期发展 (2009-2011)

    • 迅速在 Hacker News 等开发者社区走红,大家被其简洁性、高性能和丰富的数据结构所吸引。
    • 版本迭代迅速,陆续增加了持久化、主从复制等功能。
    • 2010年,VMware 聘请了 Salvatore 全职开发 Redis。
    • 2011年,《Redis 设计与实现》一书开始编写,深入剖析了其源码,极大地促进了 Redis 的普及和理解。
  3. 成熟与商业化 (2012-2015)

    • 2012年,Redis 2.6 发布,稳定性大幅提升。
    • 2013年,Redis Sentinel(哨兵模式)在 2.8 版本中稳定,提供了官方的高可用解决方案。
    • 2015年,Redis Cluster(集群模式)在 3.0 版本中正式发布,提供了官方的分布式和数据分片解决方案,标志着 Redis 进入大规模分布式应用时代。
    • Salvatore 和其同事创建了 Redis Labs 公司,为 Redis 提供商业支持和企业级产品。
  4. 现代阶段 (2016-至今)

    • 持续增加新功能,如模块系统(Redis Modules)、流(Streams)数据类型(用于实现更强大的消息队列)、更好的内存管理和性能优化。
    • Redis Labs 公司推出了 Redis Enterprise(商业版),提供了更高级的功能,如自动故障转移、持久内存支持、多模型(JSON, Graph, Search)等。
    • 2020年,Salvatore Sanfilippo 宣布退出 Redis 的日常维护工作,将项目交给 Redis 社区的核心成员。
    • 如今,Redis 已成为最流行的键值数据库,是互联网应用架构中不可或缺的组件。

如何使用 & 用在哪方面?

如何使用?

使用 Redis 通常通过其客户端命令或各种编程语言的客户端库

  1. 通过命令行客户端 redis-cli

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 连接到本地 Redis
    redis-cli

    # 基本命令示例
    127.0.0.1:6379> SET mykey "Hello World" # 设置一个字符串键值对
    OK
    127.0.0.1:6379> GET mykey # 获取键的值
    "Hello World"
    127.0.0.1:6379> LPUSH mylist 1 2 3 # 向列表左侧插入多个值
    (integer) 3
    127.0.0.1:6379> LRANGE mylist 0 -1 # 获取列表所有元素
    1) "3"
    2) "2"
    3) "1"
    127.0.0.1:6379> HSET user:1000 name "Alice" age 30 # 设置哈希对象
    (integer) 2
    127.0.0.1:6379> HGETALL user:1000 # 获取哈希对象所有字段
    1) "name"
    2) "Alice"
    3) "age"
    4) "30"
  2. 通过编程语言(以 Python 为例)
    首先安装 Redis Python 客户端库:pip install redis

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import redis

    # 连接到 Redis 服务器
    r = redis.Redis(host='localhost', port=6379, db=0)

    # 执行命令
    r.set('foo', 'bar')
    value = r.get('foo')
    print(value) # 输出: b'bar'

    # 使用列表
    r.lpush('mylist', '1', '2', '3')
    result = r.lrange('mylist', 0, -1)
    print(result) # 输出: [b'3', b'2', b'1']

用在哪方面?(应用场景)

由于其高性能和丰富的数据结构,Redis 的应用场景极其广泛:

  1. 缓存这是最常见的使用场景。将数据库查询结果、会话(Session)、网页内容等热点数据存储在 Redis 中,大大减轻后端数据库的压力,提升应用响应速度。
  2. 会话存储:将用户登录会话(Session)集中存储在 Redis 中,适用于分布式 Web 服务,实现多台应用服务器共享会话。
  3. 排行榜/计数器:利用 Sorted Set 可以轻松实现实时排行榜(如游戏积分榜、销量榜)。利用 INCR 命令实现原子性的计数器(如文章阅读量、点赞数)。
  4. 消息队列:利用 ListLPUSH/BRPOPStreams 数据类型可以实现简单的消息队列系统,用于异步任务处理、消息通知等。
  5. 发布/订阅:简单的消息广播系统,可用于实时聊天、实时消息推送等场景。
  6. 实时系统:需要极低延迟和高吞吐量的场景,如实时数据分析、欺诈检测、股票价格更新等。
  7. 社交网络:实现粉丝关系、共同关注、抽奖活动(利用 Set)等功能。

Linux 和 Windows 如何安装使用

Linux (以 Ubuntu 为例)

安装和启动非常简单,推荐使用包管理器。

  1. 安装

    1
    2
    sudo apt update
    sudo apt install redis-server
  2. 启动/停止/重启 Redis 服务

    1
    2
    3
    4
    sudo systemctl start redis-server    # 启动
    sudo systemctl stop redis-server # 停止
    sudo systemctl restart redis-server # 重启
    sudo systemctl status redis-server # 查看状态
  3. 配置

    • 主配置文件位于 /etc/redis/redis.conf
    • 例如,要允许远程连接,需要注释掉 bind 127.0.0.1 ::1 并设置 protected-mode no生产环境务必设置密码)。
  4. 使用客户端连接

    1
    2
    3
    4
    5
    redis-cli
    # 如果设置了密码,需要认证
    redis-cli -a yourpassword
    # 或者进入后认证
    auth yourpassword

Windows

官方不支持 Windows 平台。Redis 官方版本只能在类 Unix 系统上运行。在 Windows 上使用有以下几种方式:

  1. 微软维护的旧版本 (不推荐用于生产)

    • 微软 Open Tech 小组曾维护过一个 Windows 移植版,但早已停止更新,版本古老,存在很多问题,强烈不推荐用于生产环境,仅用于学习和开发测试。
    • 下载地址:https://github.com/microsoftarchive/redis/releases
  2. Windows Subsystem for Linux (WSL) - 推荐

    • 这是在 Windows 上体验原生 Redis 的最佳方式。
    • 首先在 Windows 功能中启用 WSL,然后从 Microsoft Store 安装一个 Linux 发行版(如 Ubuntu)。
    • 在 WSL 的 Ubuntu 终端中,按照上面的 Linux 安装步骤 操作即可。性能和功能与原生 Linux 完全一致。
  3. Docker (强烈推荐)

    • 无论你的宿主机是 Windows、Mac 还是 Linux,Docker 都是运行 Redis 最简单、最干净的方式。
    • 步骤:
      a. 安装 Docker Desktop for Windows。
      b. 打开命令行(PowerShell 或 CMD),拉取并运行 Redis 镜像:
      1
      2
      3
      4
      5
      6
      7
      8
      # 拉取官方镜像
      docker pull redis

      # 运行一个名为 my-redis 的容器,并将宿主机的 6379 端口映射到容器的 6379 端口
      docker run --name my-redis -p 6379:6379 -d redis

      # 如果想带持久化配置运行(使用官网的默认redis.conf)
      # docker run --name my-redis -p 6379:6379 -d redis redis-server --appendonly yes
      c. 现在你可以使用 redis-cli(需要单独下载 Windows 版的 redis-cli.exe)或者任何客户端工具连接 localhost:6379 来访问 Docker 容器中的 Redis。

总结:对于 Windows 用户,使用 Docker 或 WSL 是运行 Redis 的最佳实践。

接下来我们来详细讲解如何为 Redis 设置密码并进行相关的安全配置。您提供的步骤是完全正确的,下面我将对其进行详细的展开和说明。

详细步骤:设置 Redis 密码和允许远程连接

重要警告: 允许远程连接会大大增加服务器的安全风险。在生产环境中,除了设置强密码,还应结合防火墙规则(如 iptablesufw 或云服务商的安全组)来限制只允许可信的 IP 地址访问 Redis 端口(默认 6379)。


第 1 步:编辑 Redis 配置文件

Redis 的主要配置文件通常位于 /etc/redis/redis.conf。使用您喜欢的文本编辑器(如 nanovim)以 sudo 权限打开它。

1
sudo nano /etc/redis/redis.conf

第 2 步:找到并设置密码 (requirepass)

在配置文件中,使用搜索功能(在 nano 中按 Ctrl+W,在 vim 中按 /)查找 requirepass 指令。

您会看到类似这样的一行,默认是被注释掉的(以 # 开头):

1
# requirepass foobared

将其修改为您自己生成的、非常强壮的长密码(建议使用长随机字符串作为密码)。不要使用简单的密码如 123456password

1
requirepass YourSuperStrongPassword123!

YourSuperStrongPassword123! 替换为您自己的强密码。

原理: 设置 requirepass 后,任何客户端在执行命令前都需要先使用 AUTH <password> 命令进行认证。否则,服务器将拒绝执行任何命令。

第 3 步:(可选但常见)配置远程访问

默认情况下,Redis 出于安全考虑只绑定到本地回环地址(127.0.0.1::1),这意味着只能从本机访问。要允许其他机器连接,需要修改两个配置。

  1. 找到 bind 指令
    找到如下一行:

    1
    bind 127.0.0.1 ::1
    • 方案A(允许任何IP连接,不推荐用于生产): 直接注释掉这一行(在前面加 #)。
      1
      # bind 127.0.0.1 ::1
    • 方案B(更安全,只允许特定IP连接):bind 设置为 0.0.0.0(表示所有IPv4地址)或你服务器的特定内网IP地址。如果你不确定,方案A的注释方式通常也绑定到 0.0.0.0
      1
      2
      3
      bind 0.0.0.0
      # 或者只绑定到特定网络接口的IP
      # bind 192.168.1.100
  2. 找到 protected-mode 指令
    这是一个安全保护模式。当没有设置 bind 地址且没有设置密码时,此模式会阻止远程连接。因为我们修改了 bind 并设置了密码,所以需要关闭它。
    找到如下一行:

    1
    protected-mode yes

    将其改为:

    1
    protected-mode no

    注意: 如果你设置了密码并且只绑定了本地IP,保持 protected-mode yes 是安全的。但如果你注释了 bind 或绑定了 0.0.0.0就必须设置密码并将 protected-mode 设为 no,否则 Redis 服务器将无法启动。

第 4 步:保存配置文件并重启 Redis 服务

保存对配置文件的修改(在 nano 中按 Ctrl+O 然后 Enter,再按 Ctrl+X 退出)。

为了让新的配置生效,必须重启 Redis 服务。

1
sudo systemctl restart redis-server

检查服务状态,确保它已成功重启而没有报错:

1
sudo systemctl status redis-server

如果状态显示为 active (running),说明配置正确,服务已启动。


如何连接和认证(验证配置)

配置完成后,连接方式有以下几种。

1. 本地连接并使用 AUTH 命令认证

1
redis-cli

连接后,执行任何命令(如 SETGET)都会返回一个 (error) NOAUTH Authentication required. 错误。
这时需要使用 AUTH 命令进行认证:

1
2
3
4
5
6
127.0.0.1:6379> AUTH YourSuperStrongPassword123!
OK
127.0.0.1:6379> SET mykey "Hello"
OK
127.0.0.1:6379> GET mykey
"Hello"

2. 在连接时直接通过 -a 参数认证(方便,但密码可能出现在历史记录中)

1
redis-cli -a YourSuperStrongPassword123!

注意: 这种方式虽然方便,但密码可能会保存在 shell 的历史记录中,存在安全风险。对于生产环境的自动化脚本,建议使用其他方式(如下面的 REDISCLI_AUTH 环境变量)。

3. 使用环境变量认证(更安全的方法)

可以设置一个临时的环境变量,这样 redis-cli 会自动使用它进行认证,避免了在命令行中明文显示密码。

1
2
export REDISCLI_AUTH="YourSuperStrongPassword123!"
redis-cli

现在进入 CLI 后就可以直接执行命令,无需再手动输入 AUTH

4. 从远程机器连接

假设你的 Redis 服务器 IP 是 192.168.1.100,你可以使用 -h 参数指定主机进行连接。

在另一台Linux机器上:

1
2
3
4
redis-cli -h 192.168.1.100 -a YourSuperStrongPassword123!
# 或者先连接,再认证
# redis-cli -h 192.168.1.100
# 192.168.1.100:6379> AUTH YourSuperStrongPassword123!

总结配置流程

  1. sudo nano /etc/redis/redis.conf 编辑配置文件。
  2. 设置 requirepass your_strong_password
  3. (可选)注释 bind 行或改为 bind 0.0.0.0
  4. (如果需要远程访问)设置 protected-mode no
  5. sudo systemctl restart redis-server 重启服务。
  6. 使用 redis-cli -a your_passwordAUTH 命令进行连接测试。

遵循这些步骤,你就可以安全地配置 Redis 的密码认证和远程访问了。务必记住,对于面向公网的 Redis 实例,强密码和防火墙规则是必不可少的安全措施。