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要点:

  1. 自动过期:数据到期自动删除
  2. INSERT/UPDATE设置:使用USING TTL语法
  3. 表默认TTL:default_time_to_live属性
  4. 查询剩余时间:TTL()函数
  5. 墓碑问题:大量TTL数据注意墓碑
  6. 适用场景:会话、验证码、缓存、日志

下一步,让我们学习轻量级事务!

最后更新:2026-03-27