跳转到内容
seren-spark

02 第一次使用 Redis

学习目标 · 在 Windows 上连接一个本地 Redis,理解 Key、Value、类型与 TTL,并能独立排查连接问题。

主线使用 Redis 8.2、Java 17、Spring Boot 3.5.x 的基础能力;这是一套教学基线,不表示最新版本。大部分核心命令也适用于 Redis 7.x,特定差异会单独注明。首次拉取镜像和下载依赖需要联网。HTML 本身不联网也能阅读。

先安装并启动 Docker Desktop,使用 Linux containers 后端;Windows 根据 Docker 的提示启用 WSL 2 / 虚拟化。下面在 PowerShell 逐行执行,不要在 redis-cli 里执行 Docker 命令。

# PowerShell · 可直接执行;首次需要拉取镜像
docker version
docker run -d --name redis-learning -p 127.0.0.1:6379:6379 -v redis-learning-data:/data redis:8.2 redis-server --appendonly yes
docker exec redis-learning redis-cli PING
docker exec -it redis-learning redis-cli

预期:docker version 同时显示 Client 和 Server;docker run 返回容器 ID;PING 返回 PONG;最后出现 127.0.0.1:6379> 提示符。端口映射只绑定本机;命名卷保存 /data,容器退出后数据卷仍存在。8.2 是会更新补丁的标签,需要严格复现实验时记录镜像 digest。

下面的代码块只有命令,可以整段复制。右侧结果用文字说明,避免把输出误当成下一条命令。

SET learn:hello "redis" EX 60
GET learn:hello
TYPE learn:hello
TTL learn:hello
EXPIRE learn:hello 120
EXISTS learn:hello
DEL learn:hello
GET learn:hello
步骤预期结果学到什么
SET / GETOK / “redis”Key 是名字,Value 是内容
TYPEstring一个 Key 在同一时刻对应一种 Value 类型
TTL0 到 60 左右,随操作耗时减少返回剩余秒数;PTTL 是毫秒
EXPIRE1给已存在的 Key 更新过期时间
EXISTS / DEL1 / 1存在;成功删除一个 Key
最后 GET(nil)不存在,不是字符串 “null”

TTL 的特殊值:-1 表示存在但没有过期时间;-2 表示 Key 不存在。 读 GET 不会自动续期。普通 SET 覆盖一个已有 Key 会移除原 TTL,除非设置新的 EX/PX,或明确使用 KEEPTTL。

SET learn:ttl old EX 120
SET learn:ttl new
TTL learn:ttl
SET learn:ttl newest EX 120
SET learn:ttl final KEEPTTL
TTL learn:ttl
SET learn:once token-a NX EX 10
SET learn:once token-b NX EX 10

第一次 TTL 预期 -1;第二次为剩余正数。连续执行最后两条:第一次返回 OK,第二次通常返回 nil,因为 NX 只允许 Key 不存在时写入。EX 的单位是秒,PX 的单位是毫秒;把“检查存在”和“写入”合成一条命令,才能避免两条命令之间被另一个请求插入。

现象先检查做法
Docker 无法连接 daemon / pipe 不存在Docker Desktop 是否启动等引擎就绪后重新执行 docker version
名称 redis-learning 已占用容器是否已经创建docker ps -a 查看;已有容器用 docker start redis-learning
6379 已占用本机是否有别的 Redis改成 -p 127.0.0.1:6380:6379,宿主机应用改连 6380
Connection refused容器状态、端口映射、应用配置docker logs redis-learning 和 PING 验证
WRONGTYPE用 TYPE 看 Value 类型不要对 String 执行 HGET;核对命名冲突
NOAUTH / NOPERM身份认证 / ACL用分配的账号和命令权限连接,不是数据不存在

exit 退出 redis-cli;PowerShell 执行 docker stop redis-learning 停止练习实例,docker start redis-learning 再启动。服务端数据库编号与 SQL 库不是同一个概念:单机默认有多个逻辑 DB,但不是安全隔离。Cluster 只支持 DB 0,教程统一使用 DB 0 和 learn: 前缀。

  • “SET 后再 EXPIRE 总是等价”:如果进程在两条命令之间退出,就留下无期限数据;优先 SET 带 EX/PX。
  • “连上 Redis 就可以开放给互联网”:学习实例只监听本机;生产使用内网、ACL、适用的 TLS 与凭据管理。
  • “清理练习用 FLUSHALL 最方便”:它会删除整个实例的数据。只操作明确属于练习的 Key,不使用清库命令。

创建一个 10 秒后过期的 learn:exercise:ttl,在过期前后分别执行 GET、TTL;再创建一个不过期的 Key,对比结果。完成后只 DEL 这两个练习 Key。

自测与答案 · GET 会延长 TTL 吗?Key 到期就会立刻释放物理内存吗?

GET 不会续期;GETEX 可把读取和更新过期时间合成一个操作。练习中到期后的 GET 是 nil,TTL 是 -2。Redis 通过访问时检查与主动过期扫描清理到期数据,不保证物理内存在到期瞬间就被释放;不要把过期事件当成精确的定时任务触发器。

依据:Docker 安装说明 · SET · TTL · EXPIRE