1。前言的开头只是一句引文,但有时也值得深思,直入正题。下面分为几个部分。首先我们回顾一下Rediskey的生命周期和过期时间的设置;然后说一下过期key的删除策略;然后再说其他函数对过期key的处理。2.Key生存时间Key过期时间设置客户端可以通过Expire命令或Pexpire命令设置一个key在数据库中的生存时间,精度为毫秒级,Redis服务端会删除生存时间为0的key一段时间。接下来我们看一下Rediskey的过期时间设置和querykey的剩余寿命。EXPIREkey5#设置一个key的过期时间,单位秒EXPIREATKEY1660753861#设置过期时间某个时间戳过期(UNIX时间戳),单位秒PEXPIREkey33#设置一个key的过期时间,单位毫秒PEXPIREATkey1660839534000#设置expirationtime一个timestampexpires(UNIXtimestamp),单位毫秒TTLkey#返回key剩余的过期时间,单位秒PTTLkey#返回key剩余的过期时间,单位毫秒如何在Redis中保存这些key的过期时间Redis中维护了一个过期字典。在其数据结构中,字典的键是一个指向某个数据库键的指针,字典的键值是一个long类型的整数,表示一个毫秒级精度的UNIX时间戳。其实上面设置key过期时间的命令相当于最后调用了PEXPIREAT命令。3.key过期删除策略3.1如何判断key过期在Redis中,判断一个key是否过期,会通过下面的方法检查给定的key是否存在于过期字典中,如果存在则获取过期时间key的过期时间戳,并检查当前的UNIX时间戳是否大于key的过期时间戳,如果大于过期时间戳,则判定key过期设置定时器时,定时器会删除key当密钥的到期时间到来时立即发送密钥。优点:内存友好,可以保证尽快删除过期key,释放内存。缺点:CPU资源分配不友好。如果过期键很多,此时删除会占用大量CPU资源,间接影响Redis的性能。3.2.2懒删除懒删除只会在程序需要使用key的时候检查当前key是否过期,不会删除其他过期的key。优点:CPU资源消耗小,因为过期检查和删除只在取出key的时候进行。缺点:过期的key会占用内存。如果永远不会使用过期的密钥,则永远无法删除它,这将导致内存泄漏。延迟删除的执行步骤如下:在执行读写命令时,检查key的过期时间。如果密钥过期,则删除密钥。整个过程会当key不存在一样处理。如果key没有过期,则根据key的存在执行命令3.2.3。周期性删除周期性删除是每隔一定时间执行一次过期key的删除操作,通过限制删除操作的执行时间和频率,可以降低CPU资源占用。同时,定时删除策略也不会造成过期key的过多堆积,造成大量的内存泄漏。定时删除策略有两个重点,执行时间和执行频率。需要两者的结合才能获得最佳结果。周期删除步骤:从key集合中随机抽取20个有过期时间的key,删除过期的key。如果校验结果中超过25%的key过期,则开始新一轮的任务。每次都会在每个数据库中按顺序执行。如果它在3号数据库中返回,它将被记录下来。下次执行删除操作时,将从4号数据库开始,如此循环遍历整个Redis数据库。周期性任务执行频率:Redis为了定时检测资源和服务的状态并按照预定的策略执行相应的操作,会调用内部函数执行各种后台任务。它的执行频率由hz参数指定,默认为10,即每秒执行10次。这个值可以设置在1到500之间,但是官方建议设置在100以下,设置太大会占用CPU资源过大。基本上只有默认值就可以满足大部分需求。4、其他功能Redis数据存储有AOF和RDB两个功能,用于处理过期键。过期密钥的处理也不同。过期键的RDB持久化处理:生成RDB文件时。过期的key会被忽略,所以不会保存到RDB文件中,也不会加载到RDB文件中。主服务器模式。在加载RDB文件时,会检查key的过期时间,过期的key会被忽略,不会加载到slaveserver模式下的Redis中。所有的数据key都会被加载到Redis中进行AOF持久化处理过期key:AOF文件写入时,会追加delete语句,DELkey。AOF重写时,过期key不会写入AOF文件。当Redis服务器处于复制模式时,对过期键的处理:当主服务器删除键时,会向从服务器发送DEL命令。从服务器不会处理过期的密钥。从服务器只有在收到Master发送的DEL命令后才会删除key。Redis总结过期策略采用惰性删除和定时删除相结合的方式。惰性删除保证过期key过期后不会再被使用,定时删除保证过期数据被释放,优化资源使用。
