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都会执行