TTL过期 #
一、TTL概述 #
1.1 什么是TTL #
TTL(Time To Live)是数据的生存时间,到期后自动删除。
text
TTL工作原理:
数据写入
│
▼
设置TTL(秒)
│
▼
倒计时
│
▼
TTL到期
│
▼
数据标记为墓碑
│
▼
压缩时删除
1.2 TTL特点 #
text
TTL特点:
优点
├── 自动过期
├── 无需手动清理
├── 节省存储空间
└── 适合临时数据
限制
├── 精度:秒级
├── 最大:约68年
├── 不能用于计数器
└── 过期后创建墓碑
二、设置TTL #
2.1 INSERT时设置 #
sql
-- 设置TTL为1小时(3600秒)
INSERT INTO sessions (session_id, user_id, created_at)
VALUES (uuid(), ?, toTimestamp(now()))
USING TTL 3600;
-- 设置TTL为1天(86400秒)
INSERT INTO cache (key, value)
VALUES (?, ?)
USING TTL 86400;
-- 设置TTL为1周(604800秒)
INSERT INTO verification_codes (code_id, code, email)
VALUES (uuid(), '123456', ?)
USING TTL 604800;
2.2 UPDATE时设置 #
sql
-- 更新并设置TTL
UPDATE users
USING TTL 3600
SET temp_token = ?
WHERE user_id = ?;
-- 更新特定列的TTL
UPDATE users
SET temp_token = ?, temp_token_ttl = TTL(temp_token)
WHERE user_id = ?;
2.3 表默认TTL #
sql
-- 创建表时设置默认TTL
CREATE TABLE logs (
log_id UUID PRIMARY KEY,
log_data TEXT,
created_at TIMESTAMP
) WITH default_time_to_live = 86400; -- 默认1天
-- 修改表默认TTL
ALTER TABLE logs WITH default_time_to_live = 604800; -- 改为1周
三、查询TTL #
3.1 查看剩余TTL #
sql
-- 查看特定列的剩余TTL
SELECT TTL(session_id), session_id, user_id
FROM sessions
WHERE session_id = ?;
-- 查看多列TTL
SELECT TTL(column1), TTL(column2), *
FROM table_name
WHERE pk = ?;
3.2 TTL返回值 #
text
TTL返回值:
正数
├── 剩余秒数
└── 如 3500 表示还有3500秒过期
NULL
├── 没有设置TTL
└── 数据永不过期
0或负数
├── 已过期
└── 数据即将删除
四、TTL应用场景 #
4.1 会话管理 #
sql
-- 会话表
CREATE TABLE user_sessions (
session_id UUID PRIMARY KEY,
user_id UUID,
created_at TIMESTAMP,
last_access TIMESTAMP
) WITH default_time_to_live = 3600; -- 1小时过期
-- 创建会话
INSERT INTO user_sessions (session_id, user_id, created_at, last_access)
VALUES (uuid(), ?, toTimestamp(now()), toTimestamp(now()));
-- 刷新会话(延长TTL)
UPDATE user_sessions
USING TTL 3600
SET last_access = toTimestamp(now())
WHERE session_id = ?;
4.2 验证码 #
sql
-- 验证码表
CREATE TABLE verification_codes (
code_id UUID PRIMARY KEY,
code TEXT,
email TEXT,
purpose TEXT,
created_at TIMESTAMP
);
-- 创建验证码(5分钟有效)
INSERT INTO verification_codes (code_id, code, email, purpose, created_at)
VALUES (uuid(), '123456', ?, 'register', toTimestamp(now()))
USING TTL 300; -- 5分钟
-- 验证时检查
SELECT code, TTL(code) FROM verification_codes
WHERE code_id = ?;
4.3 缓存 #
sql
-- 缓存表
CREATE TABLE cache_store (
cache_key TEXT PRIMARY KEY,
cache_value TEXT,
created_at TIMESTAMP
);
-- 设置缓存(1小时)
INSERT INTO cache_store (cache_key, cache_value, created_at)
VALUES (?, ?, toTimestamp(now()))
USING TTL 3600;
-- 获取缓存
SELECT cache_value, TTL(cache_key) FROM cache_store
WHERE cache_key = ?;
4.4 日志数据 #
sql
-- 日志表(自动清理)
CREATE TABLE application_logs (
log_date DATE,
log_time TIMESTAMP,
log_id UUID,
log_level TEXT,
message TEXT,
PRIMARY KEY (log_date, log_time, log_id)
) WITH CLUSTERING ORDER BY (log_time DESC)
AND default_time_to_live = 2592000; -- 30天自动删除
五、TTL与墓碑 #
5.1 TTL过期机制 #
text
TTL过期机制:
过期时
├── 创建墓碑标记
├── 数据仍存在
└── 查询不返回
压缩时
├── 清理墓碑
└── 释放空间
注意
├── 大量TTL数据会产生大量墓碑
├── 影响读取性能
└── 需要合理配置压缩
5.2 减少墓碑影响 #
text
减少墓碑影响:
1. 合理设置TTL
└── 避免同时大量过期
2. 调整gc_grace_seconds
└── 加快墓碑清理
3. 选择合适的压缩策略
└── TWCS适合时间序列
4. 监控墓碑数量
└── 及时发现问题
六、最佳实践 #
6.1 TTL选择 #
text
TTL选择建议:
短期数据
├── 验证码:5-10分钟
├── 会话:30分钟-2小时
└── 缓存:分钟-小时级
中期数据
├── 日志:7-30天
├── 临时文件:1-7天
└── 统计数据:30-90天
长期数据
├── 历史记录:1-3年
└── 考虑不使用TTL
6.2 注意事项 #
text
TTL注意事项:
1. 不能用于计数器
└── 计数器不支持TTL
2. 列级别TTL
└── 每列可以独立设置
3. 更新会重置TTL
└── 更新操作需要重新设置
4. 监控墓碑
└── 大量TTL数据注意墓碑问题
5. 时区无关
└── TTL是相对时间,不受时区影响
七、总结 #
TTL要点:
- 自动过期:数据到期自动删除
- INSERT/UPDATE设置:使用USING TTL语法
- 表默认TTL:default_time_to_live属性
- 查询剩余时间:TTL()函数
- 墓碑问题:大量TTL数据注意墓碑
- 适用场景:会话、验证码、缓存、日志
下一步,让我们学习轻量级事务!
最后更新:2026-03-27