使用 Docker 快速搭建 Redis 数据库

Redis 是一个高性能的内存数据结构存储,既可作数据库、缓存,也可作消息中间件。它支持字符串、哈希、列表、集合、有序集合、位图、HyperLogLog、地理位置与流等丰富类型,提供持久化、主从复制、哨兵与集群高可用。典型用途包含会话管理、热点缓存、分布式锁、排行榜、计数器、实时订阅发布与流式分析,常见于高并发、低延迟的电商、社交、游戏与物联网场景。使用简单,性能可达百万级QPS,可靠,生态更好。


1)Redis 简介(含版权/许可说明)

Redis 是高性能的内存数据结构数据库,可作缓存、数据库与消息中间件,支持字符串、哈希、列表、集合、有序集合、位图、HyperLogLog、地理与流等,并提供持久化、复制、哨兵与集群等能力。
许可演进要点:

  • 7.4 起:Redis 改为双许可证RSALv2(Redis Source Available License 2.0)与 SSPLv1(Server Side Public License)。不再沿用 BSD-3。
  • 8.0 起:新增第三个选项 AGPLv3(三许可证:RSALv2 / SSPLv1 / AGPLv3)。

RSALv2 是否有商业风险?(要点版)

  • 允许:内部自用/部署、复制、修改与分发源代码(遵守条款)。
  • 禁止:将 Redis 的“功能作为服务提供给第三方”(含让第三方通过网络交互使用、或你的服务价值主要来自 Redis 功能)。这类“对外托管/代管”属于 RSALv2 的明确禁用场景Redis
  • 规避思路
    • 若你要做“Redis 即服务”,应采购商业授权或在 Redis 8 下按 AGPLv3 路径评估(关注你是否修改了 Redis 本体及相应开源义务);
    • 或改用 Valkey(BSD-3) 以完全回到 OSI 开源许可。
      以上为信息性说明,非法律意见

许可与合规提醒

  • 使用 Redis 8 时,你可以在 AGPLv3 / RSALv2 / SSPLv1 中选择其一(取决于你的使用方式)。若你的业务对外提供“Redis 功能即服务”,RSALv2/SSPL 的限制需要特别注意;AGPLv3 下如修改了 Redis 本体并通过网络提供,需向用户开放这些修改的源代码。

2)竞品对比(协议 / 优势 / 劣势 / 场景)

项目许可证主要优势主要劣势/注意典型场景
Redis 8AGPLv3 / RSALv2 / SSPLv1(三选一)官方生态与功能齐全(8.0 起把 JSON/TimeSeries/Search 等并入发行版;新 data type:Vector Set;性能改进)RSAL/SSPL 对“对外服务”有限制;AGPLv3 有网络传播条款(修改版需开源)需要官方能力与生态,内部系统或在 AGPL 合规可控下使用。
Valkey(Linux 基金会托管的 Redis 分叉)BSD-3社区/大厂支持,许可友好;与 Redis 7.2.4 起步兼容,发展迅速(已到 8.x)与 Redis 新特性存在节奏差(需验证模块/周边兼容)想避开 RSAL/SSPL/AGPL 争议、企业合规敏感环境;发行版打包友好。
KeyDB(多线程分叉)BSD-3单机多线程吞吐高,保留大部分 Redis 语义与 Redis 主线存在特性差距;社区节奏取决于 Snap 投入单机高吞吐/低延迟、对 Redis 完全同构要求不高的缓存/会话场景。
DragonflyBSL 1.1(源可见,非 OSI 开源)宣称极高性能、易运维许可非开源(与 AGPL/BSL 等合规边界需审查)追求极致性能/运维简化,内部部署为主。
MemcachedBSD-3设计简单、稳定、超轻量数据结构简单,无原生持久化/高阶功能纯缓存(KV)、对一致性/持久化要求不高。
Garnet(Microsoft Research)MIT兼容 Redis 客户端,单机/集群、复制与持久化能力,研究驱动新项目,生态成熟度需评估.NET/微软生态、研究或对 MIT 许可偏好。

小结:要“绝对开源”与最大合规自由→ 首选 Valkey(BSD);
要官方新功能/生态→ 用 Redis 8,并在 AGPLv3/RSALv2/SSPL 中做合规取舍。

使用 Docker 快速部署 Redis

下面示例默认使用 Redis 8(alpine) 官方镜像,带持久化(AOF)、密码和健康检查,可直接落地生产。Redis 8 Docker 镜像与标签可在官方 Hub 上找到(如 8.0.2-alpine、8-alpine 等)

目录结构

Bash
.
├─ docker-compose.yml
├─ .env
└─ redis.conf

docker-compose.yml

YAML
version: "3.9"

services:
  redis:
    image: redis:8-alpine
    container_name: redis
    command: >
      redis-server /usr/local/etc/redis/redis.conf
      --appendonly yes
      --requirepass ${REDIS_PASSWORD}
    ports:
      - "6379:6379"
    volumes:
      - ./data:/data
      - ./redis.conf:/usr/local/etc/redis/redis.conf:ro
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
      interval: 10s
      timeout: 3s
      retries: 5
    restart: unless-stopped

.env

YAML
REDIS_PASSWORD=ChangeMe_please

redis.conf

CONF
########################################
# 基础与网络
########################################
# 在容器里不要后台化
daemonize no
# 不使用 systemd 监督
supervised no

# 监听端口
port 6379
# 在容器内通常允许所有网卡(由容器网络和映射端口控制暴露范围)
bind 0.0.0.0

# 保护模式:开启后,若无密码/未绑定 loopback,会限制外部访问
protected-mode yes
# 空闲连接超时(0 表示不关闭)
timeout 0
# TCP 保活(秒)
tcp-keepalive 300
# backlog(连接队列长度),高并发环境可适当提高
tcp-backlog 511

########################################
# 安全:密码 / 命令降权 / ACL(可选)
########################################
# 与 compose 的 ${REDIS_PASSWORD} 对齐;如不需要密码请删除本行(不建议)
requirepass ChangeMe_please

# 可选:禁用高危命令(生产常见做法,若依赖这些命令请勿禁用)
# rename-command FLUSHALL ""
# rename-command FLUSHDB  ""
# rename-command CONFIG   ""
# rename-command SHUTDOWN ""
# rename-command KEYS     ""

# (可选)ACL 文件:需要细粒度权限时启用
# aclfile /usr/local/etc/redis/users.acl

########################################
# 持久化:RDB + AOF(推荐 AOF)
########################################
dir /data
# RDB 快照文件名
dbfilename dump.rdb
# 典型 RDB 触发策略(按需调整;也可全关只用 AOF)
save 900 1
save 300 10
save 60 10000
# RDB 压缩/校验
rdbcompression yes
rdbchecksum yes
# RDB 失败时是否停止写入,防止数据不一致
stop-writes-on-bgsave-error yes

# 开启 AOF,以便更强的持久化与可恢复性
appendonly yes
appendfilename "appendonly.aof"
# 刷盘策略:每秒一次,性能与持久性的折中
appendfsync everysec
# 重写期间不做 fsync,降低抖动
no-appendfsync-on-rewrite yes
# 触发重写的阈值(按需调大以减少重写频率)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 先写 RDB 头,再追加增量,提升恢复速度
aof-use-rdb-preamble yes

########################################
# 内存与淘汰
########################################
# 推荐显式限制内存,防止容器被 OOM
maxmemory 1gb
# 淘汰策略:常见为 allkeys-lru(全键空间 LRU)
# 其它可选:volatile-lru / allkeys-lfu / noeviction 等
maxmemory-policy allkeys-lru

########################################
# 性能与延迟
########################################
# I/O 线程:网络 I/O 多线程化(CPU >= 4 时可考虑开启)
# io-threads 4
# io-threads-do-reads yes

# 惰性释放,降低大 key 删除时的阻塞
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del no

# 慢查询日志阈值(微秒;10000=10ms)
slowlog-log-slower-than 10000
slowlog-max-len 128

# 关键空间通知(按需开启,带来额外开销)
# notify-keyspace-events Ex

########################################
# 复制 / 高可用(可选:作为从库时启用)
########################################
# replicaof <master-ip> <master-port>
# masterauth <master-password>
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5

########################################
# 集群(可选:仅在 Cluster 模式)
########################################
# cluster-enabled yes
# cluster-config-file nodes.conf
# cluster-node-timeout 5000
# cluster-announce-ip 10.0.0.10
# cluster-announce-port 6379
# cluster-announce-bus-port 16379

########################################
# TLS(可选:需要加密链路时)
########################################
# port 0
# tls-port 6379
# tls-cert-file /tls/redis.crt
# tls-key-file  /tls/redis.key
# tls-ca-cert-file /tls/ca.crt

########################################
# 日志与监控(容器建议打到 stdout)
########################################
loglevel notice
logfile ""
# 延迟监控(微秒阈值;0=关闭),可辅助排障
latency-monitor-threshold 100

启动与验证

Bash
docker compose up -d
docker exec -it redis redis-cli -a "$REDIS_PASSWORD" ping
# 期望输出:PONG

RabbitMQ 快速入门实践 Linux 虚拟机根目录扩容指南(使用 GParted 和 LVM) 基于Docker的Windows容器化实践
View Comments
There are currently no comments.