08_删除策略.pdf
Redis是一种内存级的键值对数据库,其特点是所有数据都是存放在内存中的。由于内存资源宝贵,因此Redis必须高效地管理内存,其中一种方式就是对数据进行过期处理。Redis中的数据有两种基本状态,一种是永久有效的,另一种是具有时效性的,即有明确过期时间的数据。在Redis中,可以通过TTL指令查看某个键的剩余生存时间。 数据删除策略是Redis内存管理的核心部分,主要包含三种策略: 1. 定时删除(Timed deletion) 定时删除策略会在数据被设置为有过期时间时,就创建一个定时器,当达到过期时间后,由定时器任务立即对键执行删除操作。这种策略的优点是节约内存,可以快速释放掉不再需要的内存占用。但是它也有缺点,即无论当前CPU负载有多高,定时删除都会占用CPU时间,这可能会影响Redis服务器的响应时间和指令吞吐量。所以,定时删除是用处理器性能来换取存储空间。 2. 惰性删除(Lazy deletion) 惰性删除策略则是对过期时间到达的数据不做立即处理,而是等到下次访问该数据时才检查其是否过期。如果未过期,就返回数据;如果过期了,则删除该数据并返回不存在的信息。惰性删除的优点是节约CPU性能,只有在需要的时候才删除数据。然而,这也导致了内存压力很大,可能会出现长期占用内存的数据。在CPU与内存之间的平衡上,惰性删除是用存储空间来换取处理器性能。 3. 定期删除(Periodic deletion) 考虑到定时删除和惰性删除各自的优缺点,定期删除策略试图找到一个平衡点。Redis在启动服务器初始化时读取配置文件中的server.hz值(默认为10),即服务器每秒钟执行server.hz次的serverCron()函数。定期删除通过activeExpireCycle()函数对每个key的过期时间进行检测,每次执行的时间为250ms除以server.hz。此过程是随机挑选一定数量的key进行检测,如果检测到的key超时,则删除这些key。如果在一轮检测中删除的key数量超过总数的25%,则继续循环执行这个过程,否则检查下一个expires[*]。参数W表示ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值,是每次activeExpireCycle()执行时随机挑选的key数量。current_db参数记录activeExpireCycle()执行进入的expires[*]。 除了上述基本的删除策略外,Redis还提供了一些相关的内存管理命令,如SETEX、EXPIRE、EXPIREAT和PEXPIRE等。这些命令用于设置键值的过期时间,它们的使用对于理解Redis如何管理内存非常关键。 在选择使用哪种删除策略时,需要考虑到内存和CPU之间的平衡。如果对内存使用非常敏感,可以选择定时删除;如果希望减少CPU的使用,可以选择惰性删除;而如果需要在这两者之间寻找平衡,那么定期删除可能是最佳选择。需要注意的是,选择不当可能会导致服务器宕机或内存泄露,因此在实施删除策略时要根据实际的应用场景和硬件资源来做出合理决策。