redis过期是如何拿不到的

worktile 其他 8

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Redis过期是通过在key的过期时间到达时进行删除或淘汰来实现的,所以在过期后无法再获取到该key的值。具体的机制可以分为以下几个部分:

    1. 过期策略:Redis中有两种过期策略,分别是定时删除和惰性删除。定时删除是通过定时器检查key的过期时间是否到达,一旦到达就删除key。惰性删除是在获取key时检查其是否过期,如果过期就删除key。

    2. 定时器:Redis使用定时器来检查过期key。定时器是基于每个数据库(db)维护的一个距离现在最近的一个过期时间。每当有新的key被设置或者被删除时,都会更新该过期时间。定时器以秒为单位,每隔一段时间(默认每秒钟)就会检查当前时间是否超过最近的过期时间,如果超过就执行删除。

    3. 惰性删除:在获取key的同时,Redis会检查其是否过期。如果过期则会删除该key。这种方式避免了定时删除的性能开销,但是会增加获取key时的时间开销。

    需要注意的是,Redis的过期策略是基于近似过期的。即定时器只能检查距离现在最近的过期时间,其他的过期时间不会被检查和删除。这样做是为了减少定时器的开销,保证系统的高性能。

    综上所述,当key过期后,Redis会通过定时删除或惰性删除来删除该key,并且无法再获取到该key的值。这是Redis处理过期的一种机制。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Redis的过期策略是通过定期删除和惰性删除两种方式来实现的。当一个键的过期时间到达时,Redis并不会立即删除该键,而是会等待下一次执行定期删除操作时,检查一定数量的键是否过期,并删除过期的键。

    下面是Redis过期策略的具体细节:

    1. 定期删除(Evict algorithm):Redis默认每隔100ms检查一定数量的键是否过期,具体数量由配置项 hz 决定,默认值为10,即每秒检查1000/10=100个键。定期删除采用的是一种比较简单的策略,它会随机抽取一定数量的键进行检查,如果发现过期则删除,直到检查完指定数量的键或者全部键都被检查完为止。

    2. 惰性删除(Lazy delete algorithm):当客户端访问一个键时,Redis会先检查该键是否过期,如果过期则删除,然后返回null给客户端。这个过程称为惰性删除,因为Redis并不会主动删除过期键,而是在访问时才进行删除。

    虽然Redis使用了上述两种策略来进行键的过期处理,但是还是有一些情况下可能无法及时删除过期键:

    1. 客户端不访问:如果一个键设置了过期时间,但是在过期时间到达之前,没有任何客户端对该键进行访问,那么这个键将无法被删除。

    2. 定期删除操作耗时:如果定期删除操作本身耗时较长,导致下一次定期删除操作还未开始时,又有新的键过期,那么这些新的过期键也无法被及时删除。

    3. 惰性删除策略:由于惰性删除是在客户端访问时进行的,如果某些键长时间没有被访问,那么即使过期了,也不会被删除。这种情况在有大量数据的情况下尤其容易发生。

    4. 内存不足:如果Redis的内存不足,可能会导致Redis无法进行定期删除操作,进而导致过期键不能被及时删除。

    5. 系统宕机:如果Redis服务器在过期键删除之前宕机了,那么这些过期键也无法被删除。

    综上所述,Redis的过期键可能无法被及时删除的原因有很多,但是通过合理的配置和监控,可以最大程度地减少过期键未被删除的情况发生。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Redis 是一种高性能的键值存储系统,它支持一些特殊的操作,如设置过期时间。过期时间是指在设置键值对时可以为键设置一个时间限制,在该时间到期之后,Redis 将自动删除该键值对。在 Redis 中,过期是通过使用定时过期删除策略来实现的。

    在 Redis 中,过期键的删除是惰性的,也就是说当我们尝试获取一个已经过期的键时,Redis 将会删除该键并且我们将无法获得该键对应的值。那么,具体来说,在 Redis 中,过期键是如何拿不到的呢?下面我将从方法和操作流程两个方面进行详细解答。

    一、过期键的拿不到方法:

    1. 使用 GET 命令获取键值对:当我们使用 GET 命令来获取一个键对应的值时,如果该键已经过期,Redis 会将该键删除,并且返回特殊的 nil 值,表示该键不存在。

    2. 使用 TTL 命令获取键的剩余过期时间:TTL 命令用于获取键的剩余过期时间,如果我们通过 TTL 命令获取一个键的剩余过期时间时,如果该键已经过期,Redis 会将该键删除,并且返回 -2,表示该键不存在。

    3. 使用 EXISTS 命令检查键是否存在:EXISTS 命令用于检查一个键是否存在,如果我们通过 EXISTS 命令检查一个键的存在时,如果该键已经过期,Redis 会将该键删除,并且返回 0,表示该键不存在。

    二、过期键的拿不到操作流程:

    1. 设置键值对的过期时间:我们可以使用 EXPIRE 或者 PEXPIRE 命令来设置一个键值对的过期时间。其中,EXPIRE 命令将键的过期时间设置为指定的秒数,PEXPIRE 命令将键的过期时间设置为指定的毫秒数。

    2. 定时删除过期键:Redis 使用定时过期删除策略来删除过期键。该过期删除策略采用了惰性删除的方式,也就是说 Redis 并不会立即删除一个已经过期的键值对,而是在我们尝试获取该键的时候才进行删除。

    3. 返回特殊的值:当我们尝试获取一个已经过期的键值对时,Redis 会将该键删除,并且返回特殊的值(如 nil、-2 或 0),来表示该键不存在。

    综上所述,Redis 中的过期键是通过定时过期删除策略实现的。当我们尝试获取一个已经过期的键时,Redis 会删除该键,并且返回特殊的值来表示该键不存在。通过使用相应的命令,如 GET、TTL 或 EXISTS,我们可以判断一个键是否已经过期,并且无法获取该键对应的值。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部