Skip to main content
[ PIER ]

Redis

驱动半个互联网的内存数据存储。

Database 支持集群 #cache#nosql#key-value

Redis 是一个内存键值存储,原生支持字符串、列表、集合、有序集合、哈希、流和发布/订阅。它是 Web 应用的默认缓存、后台任务的默认消息代理,以及几乎所有系统的默认会话存储。

使用 Pier 部署

  1. 1 打开 Pier 控制台,点击 Add service。
  2. 2 从模板列表中选择 Redis。
  3. 3 选择版本、设置服务名称,Pier 会自动配置容器、存储和端口。
  4. 4 如需 HTTPS,请绑定域名。Traefik 会自动签发 Let's Encrypt 证书。

什么是 Redis?

Redis(Remote Dictionary Server)是现代 Web 事实上的内存数据库。各种规模的 网站都使用它:作为缓存以减轻主数据库的负载、作为会话存储、作为消息队列 代理、作为实时计数器,以及作为服务之间的发布/订阅通道。

它的 API 极简 — 大约 200 个命令分布在少数几种数据结构中 — 但这些原语 组合成出人意料的强大模式。INCR 用于计数器和限流。ZADD 用于排行榜。 LPUSH/RPOP 用于队列。发布/订阅用于扇出。Streams 用于 Kafka 风格的日志。 每个键的 EXPIRE 用于自动清理。

Pier 如何部署它

Pier 使用官方 redis Docker 镜像,配合 redis-server --requirepass 强制 密码认证。数据卷挂载到 /data,其中持久化 RDB 快照和 AOF 文件。默认 版本为 latest(当前 Redis 8,支持 RESP3);也提供 7-alpine 用于 严格的 7.x 兼容性。

备份同时捕获 RDB 和 AOF 文件。连接字符串在服务页面自动构建为 redis://:password@host:6379 — 直接粘贴到你的应用配置中。

何时不要使用 Redis

对于业务记录的长期持久存储 — 使用 PostgreSQL。对于必须在容器重启后 保留且具有严格持久化保证的内容,配置 appendfsync always(较慢)或 迁移到 Postgres。对于多租户 SaaS 隔离,使用 Postgres 的行级安全 — Redis 数据库(DB 0-15)不是安全边界。

核心功能

亚毫秒延迟

内存操作以微秒完成。磁盘持久化(RDB 快照 + AOF)是异步且可配置的。

丰富的数据结构

不仅是字符串 — 列表、集合、有序集合(ZSET)、哈希、位图、HyperLogLog、地理空间索引、流和发布/订阅频道。

原子操作

INCR、LPUSH、SADD、ZADD 在引擎级别是原子的。计数器、队列、排行榜、限流器无需客户端锁定。

Lua 脚本与事务

EVAL 原子地运行 Lua 脚本 — 完整的多步骤逻辑无需往返。MULTI/EXEC 管道将多个命令包装在一个原子块中。

发布/订阅与流

内置发布/订阅用于扇出。Redis Streams 提供 Kafka 风格的仅追加日志,支持消费者组、回放和确认 — 无需运行 Kafka 集群。

每个键都可设 TTL

通过 EXPIRE 设置每个键的过期时间。适用于会话、密码重置令牌、幂等键、短期缓存。

应用场景

应用缓存

通过缓存昂贵的查询、计算视图和渲染模板,将数据库负载减少 90%+。

会话存储

将会话从 cookie 和 Postgres 中迁移到 Redis。亚毫秒读取、自动过期、跨多个应用服务器共享。

后台任务队列

Sidekiq(Ruby)、Celery(Python)、Bull(Node.js)、Resque、RQ — 大多数流行的任务队列都使用 Redis 作为代理。

限流

通过 INCR + EXPIRE 实现令牌桶 / 滑动窗口。几行代码;承受任何流量峰值。

实时排行榜与计数器

ZSET 处理百万条目的有序排行榜;ZINCRBY 以 O(log N) 更新排名。

代码示例

基本缓存模式 bash
# 带 TTL 的 SET — 60 秒缓存
redis-cli SET user:42:profile '{"name":"Aleksandr"}' EX 60

# GET
redis-cli GET user:42:profile
原子计数器(页面浏览量、限流) bash
# 原子递增;在高并发下安全
redis-cli INCR views:home

# 滑动窗口限流(每个 IP 每分钟 60 个请求)
redis-cli SET ratelimit:$IP 0 EX 60 NX
redis-cli INCR ratelimit:$IP
有序集合排行榜 bash
redis-cli ZADD leaderboard 100 alice 95 bob 88 carol

# 前 3 名
redis-cli ZREVRANGE leaderboard 0 2 WITHSCORES

# 原子排名提升
redis-cli ZINCRBY leaderboard 25 alice
带消费者组的流 bash
redis-cli XADD events '*' type signup user 42
redis-cli XGROUP CREATE events workers '$' MKSTREAM
redis-cli XREADGROUP GROUP workers w1 COUNT 10 STREAMS events '>'

对比

vs Memcached Memcached 更简单,但仅限于字符串,没有持久化、复制、发布/订阅或流。Redis 涵盖 Memcached 的用例以及其他一切。
vs Valkey Valkey 是 Redis 在 2024 年 3 月许可证变更后的开源(BSD)分支。API 兼容;如果你想走完全 OSS 路线,选 Valkey。Pier 同时提供两者。
vs KeyDB 多线程 Redis 分支。Pier 默认不提供 KeyDB 模板 — 如果需要,使用自定义 Docker 模板。
vs 用于队列的 RabbitMQ RabbitMQ 在重度 AMQP 路由语义上胜出。Redis(带 Streams 或 Bull/Sidekiq)在典型后台任务用例的简洁性、延迟和运维占用上胜出。

常见问题

Redis 还是开源的吗?
自 2024 年 3 月起,Redis 转为源代码可见的 SSPL/RSALv2 双重许可。官方 `redis` Docker 镜像仍然有效,Pier 部署它。如果你想要严格的 OSS,使用 Valkey 模板 — 它是 Linux 基金会维护的 BSD 分支,与 Redis API 兼容。
容器重启会丢失数据吗?
默认 Redis 通过 RDB 快照(每几分钟)+ AOF(仅追加文件)持久化。Pier 将 /data 挂载为持久卷,因此重启保留状态。对于关键任务的持久性,配置 `appendfsync always`。
应该分配多少内存?
总和你的热数据集 + 25% 余量。设置 `maxmemory` 和 `maxmemory-policy allkeys-lru` 以在 OOM 之前驱逐旧键。Pier 的服务设置中的资源限制控制容器内存。
可以作为集群运行 Redis 吗?
通过此模板暂不可以 — Redis Cluster 需要特殊的多端口设置。目前模板运行单节点。如果你想要类似功能 + OSS 许可证,使用 Valkey 模板。
如何从我的应用连接?
使用 Pier 在服务页面显示的连接字符串 — 通常为 `redis://:password@host:6379`。每种主流语言都有客户端(jedis、ioredis、redis-py、redis-rs、lettuce)。
默认密码?
Pier 在创建时生成强随机密码(REDIS_PASSWORD 环境变量)。在服务详情页可见;通过密码更改操作轮换。
发布/订阅与流 — 选哪个?
发布/订阅是即发即弃(无持久化、无消费者组)。Streams 持久化消息并支持带回放和确认的消费者组 — 更接近 Kafka 语义。当丢失消息会造成问题时,使用 Streams。

相关服务

在你的 VPS 上部署

Redis 是一个内存键值存储,原生支持字符串、列表、集合、有序集合、哈希、流和发布/订阅。它是 Web 应用的默认缓存、后台任务的默认消息代理,以及几乎所有系统的默认会话存储。

部署此服务 →