Redis是一个key-value的数据库服务器,它将所的数据库都保存在服务器状态redisServer结构的db数组中。db数组中的每个项都是redisDb结构,一个db数组保存着服务器中所有的数据库,默认创建16个数据库,服务器在初始化时会根据dbnum的值创建对应数量的数据库。
struct redisServer{
...
int dbnum;
redisDb *db;
...
}
typedef struct redisDb{
...
dict *dict;
dict *expires;
...
}redisDb;
Redis设置键的生存时间或过期时间
- EXPlRE 命令用于将键key 的生存时间设置为ttl 秒;
- PEXPIRE 命令用于将键key 的生存时间设置为ttl 毫秒;
- EXPIREAT < timestamp> 命令用于将键key 的过期时间设置为timestamp所指定的秒数时间戳;
- PEXPIREAT < timestamp > 命令用于将键key 的过期时间设置为timestamp所指定的毫秒数时间戳。
** SETEX命令可以在设置一个字符串key时,同时设置该key的过期时间(只能用于字符串键).
** TTL 命令和PTTL 命令接受一个带有生存时间或者过期时间的键,返回这个键的剩余生存时间.
> time
1) "1545470973"
2) "878082"
> expireat key1 1545471973
(integer) 1
> ttl key1
(integer) 962
key删除策略
- 定期删除:Redis每隔一段时间就会去查看Redis设置了过期时间的key,会在100ms的间隔中默认查看3个key。
- 惰性删除:如果当你去查询一个已经过了生存时间的key时,Redis会先查看当前key的生存时间,是否已经到了,直接删除当前key,并且给用户返回一个空值。
Redis的淘汰机制
在Redis内存已经满时,添加一个新的数据,执行淘汰机制。
- volatile-lru:在内存不足时,Redis会在设置过了生存时间的key中干掉一个最近最少使用的key。
- volatile-lfu:在内存不足时,Redis会在设置过了生存时间的key中干掉一个最近最少频次使用的key。
- volatile-ttl:在内存不足时,Redis会在设置过了生存时间的key中干掉一个剩余生存时间最少的key。
- volatile-random:在内存不足时,Redis会在设置过了生存时间的key中随机干掉一个。
- allkeys-lru:在内存不足时,Redis会在全部的key中干掉一个最近最少使用的key。
- allkeys-lfu:在内存不足时,Redis会在全部的key中干掉一个最近最少频次使用的key。
- allkeys-random:在内存不足时,Redis会在全部的key中随机干掉一个。
- noeviction:(默认)在内存不足时,直接报错。
** 指定淘汰机制的方式:maxmemory-policy具体策略,
** 设置Redis的最大内存:maxmemory 字节大小