`
DiaoCow
  • 浏览: 244351 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

《Redis源码学习笔记》键过期

阅读更多
《Redis源码学习笔记》文章列表

Redis可以为数据库中的每一个键关联一个过期时间,当到达指定时间后Redis就会把该键从数据库中删除,eg:

redis 127.0.0.1:6379> setex name 5 diaocow   # 为键name设置5秒的过期时间
OK
redis 127.0.0.1:6379> 5 秒后...
redis 127.0.0.1:6379> get name   # 键过期被删除,返回nil
(nil)

那这一切Redis究竟是怎么实现的呢?

1. 在RedisDb中维护了一个expires字典,其中的键就是那些已经设置了过期时间的键,而键值就是该键的过期时间(毫秒):



2. 当我们去操作数据库中的一个键时(或读或写),Redis会首先检查该键是否已经过期(用当前时间去和键的过期时间比较),如果过期就删除,否则执行正常的操作流程,这种删除方式我们称作:惰性删除,伪代码:
def expireIfNeeded(key)
	# 获取该键的过期时间
    when_msec = redisDb.expires.get(key)
    # 该键没有关联任何过期时间
    if when_msec is None: 
        return False
    # 未过期
    if now_msec < when_msec: 
        return False
    # 已经过期
    redisDb.data.del(key)       # 从数据库中删除该键
    redisDb.expires.del(key)    
    propagateExpire(key)        # 把键过期消息同步给所有的slave节点(如果有必要)
    return True

具体细节请看:db.c/expireIfNeeded函数

3. 在服务器的常规计划任务中(serverCron),Redis会定期清理数据库中过期的键,具体过程为:循环每个数据库,从expires字典中随机挑选若干键,检查是否过期,如果过期就删除(这种删除方式,我们称作:定期删除);为了防止这种清理过期键方式占用太多时间从而阻塞客户端请求(因为Redis是单线程的),Redis每当迭代了一定次数,就会检查已经运行了多长时间,并且当运行时间超过指定时间时,就结束清理过期键,伪代码:
def activeExpireCycle()
	# activeExpireCycle函数能够运行的时间限制 
    timelimit = THIS_FUNCTION_CAN_RUN_MS
    start_time = time.now()
    
    for dbnum in redisServer.dbs:
    	# 随机从标号为dbnum的数据库中取出MAX_EXPIRELOOKUPS_PER_CRON个键,检测是否过期
        for (i = 1; i < MAX_EXPIRELOOKUPS_PER_CRON; i++):
            if isKeyExpired(redisDbs[dbnum].expires.getRandomKey()):
                # 若过期,清理键
                redisDbs[dbnum].data.del(key)
                redisDbs[dbnum].expires.del(key)
                propagateExpire(key)
        # 检测目前运行时间,若超过timelimit,则推出
        if(time.now() - start_time >= timelimit): return

具体细节请看:redis.c/activeExpireCycle函数

键过期对slave和master的影响:

1. 当master删除一个过期键时,它会通过DEL KEY-NAME命令,把这“删除消息”传播给它的slaves:



2. 当客户端向slave请求一个过期键时,它仅仅告知客户端该键不存在(返回nil),而不会真的去删除这个键,只有当它收到master发过来的DEL命令时,它才会去删除一个键;

3. slave和master这样的做法(1和2)都是为了保证master-slave数据的一致性;

4. master/slave在保存RDB文件时会过滤那些已经过期的键,从而尽可能保证,存到RDB文件中的数据都是有效的(注意:这里只是过滤而不是删除);

5. 非slave在加载RDB文件时同样也会过滤掉那些已经过期的键,从而尽可能保证,加载到内存中的数据都是有效的(当slave加载RDB文件时,它会全数加载,而不经过任何判断和过滤(即使加载的那个键已经过期),而这一切同样是出于数据一致性考虑的)

总结:
1. 熟悉键过期相关命令:setex expire ttl
2. 了解键过期实现原理;
3. 了解键过期对master/slave的影响

  • 大小: 4.4 KB
  • 大小: 9.3 KB
分享到:
评论

相关推荐

    redis学习笔记.pdf

    Redis学习笔记 Redis是一个开源的基于键值对(Key-Value)NoSQL数据库,使用ANSI C语言编写、支持网络、基于内存但支持持久化。性能优秀,并提供多种语言的API。Redis可以被称为KV数据库,键值对数据库,内部存储...

    Redis全套学习笔记

    以下是关于Redis学习笔记的详细内容: 1. **Redis概述和安装** Redis是一个开源的内存数据结构存储系统,可以作为数据库、缓存和消息代理使用。它支持多种数据结构,且性能极高。Redis的安装通常涉及下载源码、...

    Redis学习笔记

    本学习笔记将基于提供的压缩包文件,深入探讨Redis的关键特性、工作原理以及常见应用场景。 首先,"深入redis学习(一)--readme and conf.doc"介绍了Redis的安装和配置过程。在配置文件中,我们可以设置服务器的...

    燕十八redis视频教程笔记资料

    首先,从官方网站下载最新稳定版的Redis源码或二进制包。在Linux环境下,可以使用编译源码的方式进行安装,涉及到`make`和`make install`等命令。对于Windows用户,可直接下载预编译的二进制包,解压后配置环境变量...

    2022年redis学习笔记

    这份2022年的Redis学习笔记涵盖了Redis的基础概念、核心特性、使用场景以及最佳实践。 一、Redis简介 Redis是一个开源(BSD许可)的,非关系型、内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。它...

    redis学习笔记,redis详解,Java源码.zip

    Redis是一款高性能的键值对数据库,它以内存存储为主,数据持久...通过阅读本学习笔记和源码分析,你可以深入了解Redis的工作原理,掌握如何在实际项目中高效地使用Redis。不断实践和探索,你将成为Redis的熟练驾驭者。

    redis初级入门笔记

    Redis 是一个高性能的键值对数据库,常被用于数据缓存、消息队列以及数据库功能。...同时,不断学习和实践 Redis 的高级特性,如事务、持久化策略、集群等,将有助于提升你的数据库管理和应用开发能力。

    Redis全面深入学习笔记(强烈推荐).docx

    这样,当内存达到上限时,Redis会自动根据LRU策略删除不常使用的键,而无需手动设置每个键的过期时间。 在深入学习Redis时,还需要掌握更多高级特性,如持久化(RDB和AOF)、事务、发布订阅、主从复制、哨兵系统和...

    redis学习笔记

    Redis 的安装过程通常在 Linux 系统上进行,首先需要从官方网站下载最新版本的 Redis 源码包,然后通过编译和配置步骤进行安装。在 Linux 环境中,这通常涉及解压源码、配置编译选项、编译源码和安装二进制文件到...

    redis心得笔记--180202

    Redis的源码清晰易读,学习源码可以帮助理解其内部工作原理,比如内存管理、命令解析、网络通信等。同时,了解源码对于优化Redis性能、定制功能或者排查问题非常有帮助。 6. 工具应用 - Redis Commander:图形化...

    redisDoc:Redis源代码学习笔记

    "redisDoc:Redis源代码学习笔记"是一份深入解析Redis 5.0.8版本源码的资料,旨在帮助开发者理解其内部机制。以下是针对该标题和描述所涉及的知识点的详细解释: 1. **基础数据类型**: Redis支持五种基础数据类型...

    redis-note:Redis学习笔记

    Redis的学习笔记主要涵盖以下几个核心知识点: 1. **Redis基本概念** Redis是一个开源(BSD许可),内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、哈希、列表、...

    redis笔计(第二版)

    - 特性:支持发布/订阅、过期键、事务等高级特性。 2. Redis 安装 在 Linux 系统中,首先需要安装SSH服务器和必要的编译工具,例如GCC。下载Redis源码包,解压缩后通过`make`命令编译。编译完成后,将`redis-...

    Redis--参考资料即总结

    标题中的“Redis--参考资料即总结”暗示了这篇博文可能是一个关于Redis的综合教程或学习笔记,旨在帮助读者理解并掌握Redis的核心概念和使用技巧。博主sw1982在iteye博客上分享了他们的理解和实践,可能是基于个人...

    redis基本命令model-for-net开发笔记

    本笔记主要探讨 Redis 的基本命令,帮助 .NET 开发者更好地理解和使用 Redis。 1. **安装与启动** Redis 可在多种操作系统上运行,包括 Windows 和 Linux。在 Linux 上通常通过源码编译安装,Windows 用户可以下载...

    韩顺平 PHP Memcached缓存技术资料源码笔记图解PPT_Ady

    5. 检查键是否存在:使用`exists()`方法检查键是否已存在于缓存中。 四、Memcached的特性与优化 - 分布式:Memcached支持多台服务器集群,数据会自动分布到各个节点,提供高可用性。 - 压缩:可以设置自动压缩数据...

    jedis使用指南

    具体事务和监听请参考文章:redis学习笔记之事务 暂时找到三种实现方式: 1. 通过jedis.setnx(key,value)实现 import java.util.Random; import org.apache.commons.pool.impl.GenericObjectPool.Config; import ...

Global site tag (gtag.js) - Google Analytics