4.6 缓存、Redis 与 ID 发号器

缓存、Redis 与 ID 发号器

缓存与 ID 发号器是两个独立配置。缓存加速读取;发号器为每个域名生成递增 ID,再编码为短码。

驱动组合

缓存 发号器 场景 Redis 不可用时
memory local 单实例 不依赖 Redis
redis local 单实例且共享缓存 缓存会回退到内存;发号器不受影响
redis redis 多实例 缓存可回退,但 Redis 发号器会拒绝启动

缓存配置为 Redis 但客户端不可用时,服务会记录告警并降级到 memory。ID 发号器配置为 Redis 时没有安全降级,因为静默切到本地计数器会产生跨实例冲突。

配置示例

redis:
  host: redis
  port: 6379
  password: "使用随机强密码"
  db: 0
cache:
  driver: redis
id_generator:
  driver: redis

对应环境变量:

REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD='使用随机强密码'
REDIS_DB=0
CACHE_DRIVER=redis
ID_GENERATOR_DRIVER=redis

发号器初始化

服务启动时读取所有启用域名,查询该域名现有短链的最大 ID,并初始化域名计数器。Redis 发号器使用类似 domain_counter:<domain-id> 的键,通过原子自增分配 ID;本地发号器使用进程内互斥计数器。

不要手工调小或删除生产环境计数器。若必须恢复 Redis,应先从数据库最大 ID 重建并在单实例维护窗口验证。

安全建议

  • Redis 只监听私网或容器网络,不映射公网端口。
  • 设置强密码,并通过密钥系统注入。
  • 多实例使用同一个 Redis 数据集;不要让每个实例指向不同 Redis。
  • 监控 Redis 内存、持久化、复制状态、延迟和连接数。
  • 备份优先保证数据库;Redis 中的缓存可重建,但发号器计数器需要与数据库最大 ID 对齐。

故障排查

redis-cli -h redis -p 6379 -a '密码' ping
curl --fail http://127.0.0.1:8080/health

/health 中 Redis 为 DISABLED 表示服务没有可用 Redis 客户端;DOWN 表示已配置但 Ping 失败。进一步检查 DNS、网络策略、密码和 Redis DB。

相关章节:数据库与迁移FAQ