redis为什么不删除过期key

worktile 其他 7

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Redis不立即删除过期的 key,主要是为了保证性能和减少对系统的负担。

    首先,Redis的主要特点之一就是其高性能。Redis是通过将数据存储在内存中来实现高速读写的。当一个key过期时,Redis并不会立即删除它,而是等到有需要的时候才去删除。这样可以避免在每次操作时都进行过期key的删除,减少了系统的开销,提高了系统的性能。

    其次,延迟删除可以减少非常规的磁盘I/O。在Redis中,过期的key将被放置在一个独立的队列中,称为过期字典。当有客户端请求读取一个过期的key时,Redis会检查该key是否在过期字典中,并在确认之后删除该key。这样可以减少对磁盘的读写操作,减轻了Redis的负担。

    另外,Redis还采用了定期删除和惰性删除的策略。定期删除是指Redis会定期地检查过期字典中的key,并删除其中已经过期的key。而惰性删除是指在对一个过期key进行操作时,Redis会立即检查该key的过期时间,并删除它。这样可以保证系统的资源得到充分利用,不会出现过多的过期key堆积,导致系统性能下降。

    综上所述,Redis不立即删除过期key主要是为了保证性能和减少对系统的负担。延迟删除、定期删除和惰性删除的策略是为了保证系统的高性能和可靠性。通过这样的设计,Redis能够更好地满足用户的需求,并提供高效的数据存储和访问服务。

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

    Redis并不主动删除过期的key,而是采用惰性删除和定期删除两种方式来处理过期key。

    1. 惰性删除:当客户端试图访问一个已经过期的key时,Redis会先检查该key是否过期,如果过期则会将其删除。这种方式可以确保已经过期的key不再被访问,但是如果没有客户端访问过期key,那么它就会一直留在数据库中。

    2. 定期删除:Redis会周期性地(默认每秒钟10次)对数据库中的一部分过期key进行删除操作。每次删除操作只会删除一定数量的过期key,如果删除过程耗时过长,那么下一次删除操作就可能被推迟。这种方式可以保证过期key在一定时间内被删除,但是不能立即删除所有过期key。

    为什么Redis选择采用惰性删除和定期删除的方式而不是立即删除过期key呢?

    1. 减少删除操作对性能的影响:Redis是单线程处理命令的,如果每次访问都去立即删除过期key,那么会增加删除操作的开销,降低Redis的性能。

    2. 避免资源浪费:如果Redis每次都立即删除过期key,那么会消耗大量的CPU和内存资源来维护过期key的状态,而这些资源在绝大部分情况下是没有必要的。

    3. 提高一致性:如果过期key被立即删除,那么在并发环境下可能会导致多个客户端同时访问到过期的key。而采用惰性删除和定期删除的方式,可以确保过期key在一定时间内被删除,减少并发环境下的一致性问题。

    4. 简化代码实现:采用惰性删除和定期删除的方式可以简化Redis的代码实现,而不需要处理额外的删除逻辑。

    5. 兼容性考虑:Redis的惰性删除和定期删除方式可以兼容不同的应用场景和使用方式,同时也能够提供较好的性能和稳定性。如果采用立即删除过期key的方式,可能会导致一些特定场景下的性能问题或数据丢失问题。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Redis之所以不主动删除过期key,是因为其设计和实现的目标是追求高性能和低延迟。Redis使用了一种内存分配的机制,即惰性删除(lazy deletion),这种机制可以避免对内存的频繁写操作,从而提高性能。

    具体来说,当一个key设置了过期时间后,Redis会在key过期时,根据需要的内存量优先从过期的key中删除一部分,然后再根据需要写入新的数据。这种方式可以避免频繁的内存分配和释放操作,减少内存碎片。同时,通过在读操作时检查key是否过期,Redis可以保证在过期之前不返回过期的key,从而实现了最大限度地减少不必要的内存操作和响应延迟。

    当然,在某些情况下,如果应用程序对内存的使用非常敏感,可以采取手动删除过期key的方式,通过编写一段定期的删除过期key的代码来进行管理。这样可以确保内存的使用始终处于一个可控的状态。

    在实际应用中,当Redis的内存使用达到配置的上限时,Redis会根据设置的过期策略自动进行内存回收。目前Redis支持以下几种过期策略:

    • noeviction:不删除过期的key,返回错误。
    • volatile-lru:在设置了过期时间的key中,删除最近最少使用的key。
    • volatile-ttl:在设置了过期时间的key中,删除即将过期的key。
    • volatile-random:在设置了过期时间的key中,随机删除一个key。
    • allkeys-lru:所有的key中,删除最近最少使用的key。
    • allkeys-random:所有的key中,随机删除一个key。

    通过选择合适的过期策略,可以根据实际需求来确保Redis的性能和内存的使用达到一个平衡,从而更好地满足应用需求。

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

400-800-1024

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

分享本页
返回顶部