expires
在之前数据库的结构中可以看到,每一个数据库除了用变量dict来保存所有的key-value对之外,还通过一个expires成员变量来保存所有设置了过期时间的key
typedef struct redisDb {
dict *dict; /* 数据库 */
dict *expires; /* 过期键集合 */
......
} redisDb;
expires也是通过字典dict来实现的,其中每一个key-value对中的key为设置了过期时间的key,value为UNIX时间戳,为超时时间。
设置过期时间
设置过期时间的命令主要有以下几个,其中expire都是以秒为单位,pexpire都是以毫秒为单位的。
SETEX key seconds value
EXPIRE key seconds
EXPIREAT key timestamp
PEXPIRE key milliseconds
PEXPIREAT key milliseconds-timestamp
这些命令最终都是调用setExpire()来将key-when对加入到集合db->expires中的。
void setExpire(redisDb *db, robj *key, long long when) {
kde = dictFind(db->dict,key->ptr); //首先在dict中找到key
redisAssertWithInfo(NULL,key,kde != NULL);
de = dictReplaceRaw(db->expires,dictGetKey(kde)); //将key加入到expires集合中
dictSetSignedIntegerVal(de,when); //设置过期时间
}
#define dictSetSignedIntegerVal(entry, _val_) \
do { entry->v.s64 = _val_; } while(0)
//过期时间直接以整数的形式存放在每一个entry的val中
//而不是以robject对象的形式存在
为了节省内存,在将过期键加入到expires字典的过程中,expires会重用dict中key对应的sds对象。
expires中每个key-value对的value直接存放过期时间when
如下图所示:
删除过期键
一般的删除操作可以有三种策略:
1)定时删除:超时时间到达时,删除
2)惰性删除:再次访问时,删除
3)定期删除:每隔一定周期,删除
对于定时删除:由于数据库可能同时接受成千上万个用户的访问,那么可能有大量的key需要删除,如果我们为每一个key的超时时间都设置一个定时器,每次超时就进行删除操作,那么会导致系统性能非常低。
对于惰性删除:如果一个过期key长期没有被访问,那么该key-value对将会一直存储在数据库中,会一直占有内存。而redis又是一个基于内存的数据库,这样很容易导致内存被耗尽。
对于定期删除 :redis难以确定执行删除操作的时长和频率
因此redis采用惰性删除和定期删除相结合的方式,来删除系统中的过期键。
惰性删除
惰性删除由db.c/expireIfNeeded()
函数实现,所有读写数据库的命令在执行之前都会调用expireIfNeeded()函数对要操作的key进行检查。如果key已经过期,那么将会将key从数据库中删除
定期删除
定期删除由函数redis.c/activeExpireCycle()
函数实现,每当server在调用beforeSleep()和serverCron()时,都会被调用
本文所引用的源码全部来自Redis3.0.7版本
redis学习参考资料:
Redis 设计与实现(第二版)
相关推荐
Redis稳定版 Redis-x64-5.0.14.1.zip
Redis-x64-5.0.10.msi
Redis全套学习笔记-带章节目录
Redis下载,Redis Server,Redis-x64-5.0.9.zip
文件夹内包括有Redis-x64-3.0.504.zip、Redis-x64-3.2.100.msi。可供大家下载安装。
redis校验工具redis-full-check,配合redis-shake使用!!!
1.设置服务命令 redis-server --service-install redis.windows-service.conf --loglevel verbose 2 常用的redis服务命令。 卸载服务:redis-server --service-uninstall 开启服务:redis-server --service-start ...
Redis 64位window 版 Redis-x64-3.2.100
资源在github上下载下来,包含Redis-x64-3.2.100.zip和Redis-x64-3.2.100.msi两个文件
之前项目中要使用window下的redis。找了好久都只有Redis-x64-3.2.100的,后来发现有更高...这里附件里面包括Redis-x64-5.0.14.1 for Windows版本 与及 原始下载地址。如果有新的版本的话,可以到在原始下载地址找到。
Redis-x64-3.0.504安装包
Redis-x64-5.0.14 windows
最新版windows Redis-x64-5.0.14.1.zip最新版windows Redis-x64-5.0.14.1.zip
Redis-x64-5.0.14.1.msi Redis-x64-5.0.14.1.msi Redis-x64-5.0.14.1.msi
Redis-x64-3.2.100版本,你们可以下载,如果实在没有积分可以私聊我。
Redis-x64-win-3.2.100+nginx-win
Redis-x64-5.0.14.1 缓存程序,Windows系统可用文件
删除服务双击 redis_uninstall-service.bat 启动服务 方法一: 在命令行窗口跳转到D:\Redis-x64-3.2.100目录下执行 redis-server.exe --service-start 方法二: 打开管理工具 服务,找到Redis服务。 通过...
Redis版本:Redis-x64-5.0.14.1 管理工具:RESP_app
Windows版redis下载版本号Redis-x64-3.2.100,官网上下载需要到github上