聊一聊Redis的过期话题

182 阅读2分钟

1、Redis最重要的一个运用就是作为缓存使用,首先内存时比较昂贵的,也是有限的,那么也就是要对内存的使用要有所管理,淘汰掉没用的缓存是个非常好的方法。下面我们就看看Redis中的过期问题吧。

2、有哪些命令可以使key过期呢?

expire key seconds:设置key的有效时间,以秒为单位
expireat key time:设置key的到期的UNIX时间戳,以秒为单位
pexpire key milliseconds:设置key的有效时间,以毫秒为单位
pexpireat key ms_time:设置key的到期时间,以毫秒为单位
persist key:移除key的过期时间
pttl key:获取key的有效毫秒数
ttl key:获取key的有效秒数
setex key seconds value:设置key的有效时间,以秒为单位,是一个原子操作
psetex key milliseconds value:设置key的有效时间,以毫秒为单位,是一个原子操作
set key value ex seconds:设置key的有效时间,以秒为单位,是一个原子操作
set key value px milliseconds:设置key的有效时间,以毫秒为单位,是一个原子操作
touch key:修改指定key的最后访问时间

3、那么Redis底层是如何保存这些过期信息的呢?

typedef struct redisDb {
    dict *dict;                 
    dict *expires;保存所有设置过期时间的key,value为一个signed int值
    dict *blocking_keys;        
    dict *ready_keys;           
    dict *watched_keys;         
    int id;db的编号,一般用0号库
    long long avg_ttl;          
    unsigned long expires_cursor; 
    list *defrag_later;         
} redisDb;

4、有哪些淘汰策略呢?

no_eviction:表示不会淘汰key
allkeys_random
allkeys_lru
allkeys_lfu
volatile_random
volatile_lru
volatile_lfu
volatile_ttl
allkeys开头的会从redisDb->dict中淘汰
volatile开头的会从redisDb->expires中淘汰

5、相关的配置

maxmemory:Redis的最大使用内存
maxmemory_policy:过期策略
maxmemory_samples:随机抽样的精度

6、相关的结构

struct evictionPoolEntry {
    unsigned long long idle;对象的空闲时间
    sds key;                    
    sds cached;                 
    int dbid;                   
};

7、什么时候淘汰key呢?

1、访问数据库键时,校验key是否过期,如果过期则删除
2、周期性删除过期key,beforeSleep和serverCron都会执行