作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL
PostgreSQL
Redis(本章节)
Etcd
我们前面在介绍数据库增删改查的时候,介绍过数据库的过期时间,今天这个小节我们来比较详细的介绍他的过期时间(TTL)。
一、Redis 基本操作命令(TTL相关)
这里我们使用的字符串类型来演示。
# 1. 设置一个普通键值对
SET user "zhangsan"
# 2. 给键设置60秒过期
EXPIRE user 60
# 3. 查看剩余过期时间(返回约50+秒)
TTL user
# 4. 移除过期时间
PERSIST user
# 5. 再次查看(返回-1,永不过期)
TTL user
# 6. 设置key的时候附带过期时间
SETEX user1 20 "zhangsan" 
二、Redis 过期键的清理机制(核心)
Redis 不会在键过期的瞬间立即删除,而是通过三种机制来清理过期键,这是理解过期问题的关键:
# 设置键10秒过期
SETEX user1 10 "zhangsan"
# 10秒内访问:返回zhangsan(未过期)
GET user1
# 10秒后访问:返回(nil)(惰性删除)
GET user1
# 再次查看键是否存在:返回0(已删除)
EXISTS user1
优点:节省 CPU 资源,只在必要时清理;
缺点:若过期键长期不被访问,会一直占用内存,导致内存泄漏。
核心规则:
# 每100ms执行一次定期删除(默认开启)
hz 10
# 每次定期删除的最大耗时(默认250ms)
active-expire-effort 1优点:平衡 CPU 和内存,定期清理过期键;
缺点:可能存在漏删(抽取的键不一定包含所有过期键)。
3.内存淘汰(Memory Eviction)
原理:当 Redis 内存使用达到 maxmemory 上限时,会触发内存淘汰策略,优先删除过期键(若有),若没有则删除正常键。
常见淘汰策略:(redis-cli 可通过 CONFIG GET maxmemory-policy 查看)
volatile-lru:淘汰过期键中最少使用的;
volatile-ttl:淘汰过期键中剩余时间最短的;
allkeys-lru:淘汰所有键中最少使用的(包括未过期);
noeviction:默认策略,不淘汰,内存满时拒绝写入(返回错误)。