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 applicable scene.doc"最后会分析Redis在缓存、消息队列、计数器、发布订阅等场景中的应用,以及与其他数据库和工具的集成。 通过这些文档的学习,读者可以全面掌握Redis的基础知识...
这份"redis笔记.rar"包含的"redis笔记.pdf"应该是一份详细的学习指南,非常适合初学者了解和掌握Redis的基本概念、操作命令以及实战技巧。 1. Redis基本概念: - Redis是一个开源的、基于内存的数据存储系统,支持...
本资源包包含了关于Redis的学习笔记以及一个基于SpringBoot整合Redis的实战项目——"springboot-redisdemo",旨在帮助你深入理解和应用Redis。 首先,让我们详细探讨Redis的核心知识点: 1. **Redis的数据类型**:...
此外,Key可以设置过期时间,使用expire命令设置过期时间后,Redis会自动删除过期的Key,ttl命令则可以查看Key的剩余存活时间。 Redis支持的五大数据类型包括String、List、Set、Sorted Set和Hash。在本次学习笔记...
- **Key 管理命令**:如 `DEL` 删除 key,`EXPIRE` 设置 key 过期时间。 - **安全和认证管理**:启用认证,如 `AUTH` 登录,`RENAME-KEYSPACE` 更改命名空间。 - **事务管理**:使用 `MULTI`、`EXEC` 开启和提交事务...
- **读取与写入**:`GET key`获取键值,`DEL key`删除键,`INCR key`对数值键进行自增操作。 - **集合操作**:`LPOP key`移除并返回列表的第一个元素,`SMEMBERS key`获取集合所有成员,`ZRANGE key start stop ...
- **键操作**:包括检查键是否存在 `EXISTS key`,删除键 `DEL key`,以及过期设置 `EXPIRE key seconds`。 - **事务**:使用 `MULTI`,`EXEC` 开启和提交事务,确保一系列命令原子执行。 - **管道**:通过发送多...
### Redis学习资料的完整笔记 #### 一、入门简介 ##### 1.1 NoSQL非关系型数据库 - **概念**:NoSQL全称为Not Only SQL,是指非关系型数据库,区别于传统的基于表的关系型数据库(如MySQL、Oracle等)。这类...
【Redis学习笔记】 Redis是一个基于键值对的高性能NoSql数据库,特别适合处理高并发读写和海量数据的高效存储和访问。Redis以其丰富的数据类型和出色的速度在各种应用场景中得到了广泛的应用。 **NoSql简介** ...
Redis学习笔记大全 Redis是当前使用最广泛的NoSQL数据库之一,具有高性能、低延迟和支持事务等特点。本文将对Redis的基本概念、安装、启动、关闭、基本命令、5大数据类型、发布和订阅、Bitmaps和HyperLoglog等进行...
- 设置键过期:`expire key seconds`、`pexpire key milliseconds`等。 - 清除过期时间:`persist key`。 - 查看键类型:`type key`。 - **键名操作**: - 重命名键:`rename key newkey`。 - 随机返回一个键:...
Redis是一款高性能的键值存储系统,常用于数据库缓存、消息队列等场景。本教程主要涵盖Redis的各种数据类型及其应用、分布式锁的实现、主从复制、持久化策略、...学习和掌握这些内容,有助于深入理解和高效使用Redis。
以下是关于Redis学习笔记的详细内容: 1. **Redis概述和安装** Redis是一个开源的内存数据结构存储系统,可以作为数据库、缓存和消息代理使用。它支持多种数据结构,且性能极高。Redis的安装通常涉及下载源码、...
- 设置键的生存时间(TTL),自动清理过期数据。 - 定时删除、惰性删除、定期删除三种策略组合,平衡内存使用和CPU开销。 7. **案例实战** - 使用Redis做缓存:将数据库中的热点数据缓存到Redis,减少数据库读取...
- Redis允许为键设置过期时间,过期后键会被自动删除。 - 过期策略包括定时删除、惰性删除和定期删除,Redis会根据实际情况动态选择。 **7. Redis的内存管理** - 内存上限:可以通过配置限制Redis的内存使用量,...
- 设置合理的过期策略:避免大量键同时过期导致的内存压力。 6. **安全与运维**: - 密码认证:设置密码保护,限制未经授权的访问。 - 防火墙配置:仅允许特定IP访问。 - 监控和日志:定期检查性能指标,如内存...