一、Redis中的数据库
在Redis中,每个客户端都有自己的目标数据库,每当客户端执行数据库写命令或者数据库读命令的时候,目标数据库就会成为这些命令的操作对象。
默认情况下,Redis有16个数据库,从0号数据库到15号数据库。
在默认情况下,Redis客户端的数据库为0号数据库,但客户端可以通过执行select命令来切换数据库。切换之后,在客户端中会显示数据库的标号(当然0号数据库不显示)
抠张图看看
二、Redis键的生存时间或过期时间
在Redis中,通过EXPIRE或者PEXPIRE命令,你可以以秒或者毫秒为数据库中的某个键设置生存时间,在经过指定的数秒或者毫秒之后,服务器就会自动删除生存时间为0的键。
抠张图看看
与EXPIRE或者PEXPIRE命令类似,客户端可以通过EXPIREAT或者PEXPIREAT命令,以秒或者毫秒给数据库中的某个键设置过期时间,其中,过期时间为一个UNIX时间戳,当键的过期时间来临时,服务器就会删除这个键。
抠张图看看
TTL和PTTL命令接受一个带有生存时间或者过期时间的键,返回这个键的生育生存时间,也就是,返回距离这个键被服务器自动删除还有多长时间。
抠张图看看
在上面的四种设置键的生存时间或过期时间,但实际上EXPIRE、PEXPIRE、EXPIREAT都是使用PEXPIREAT来实现的,都是由PEXPIREAT转换而来的。
三、过期键的删除策略
在Redis中,对于键的删除,有三种策略
①定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作
优缺点:
a、定时删除策略对内存是最友好的,但是对CPU时间是最不友好的,因为在过期键较多的情况下,删除过期键这一行为可能会占用相当一部分CPU时间,这样便会对服务器的响应时间和吞吐量造成影响。
②惰性删除:放任键过期不管,但是每次从键空间获取键时,都检查取得的键是否过期,如果过期,则删除该键,不然,返回该键
优缺点:
a、惰性删除策略对CPU时间是最友好的,但是对内存不友好,如果一个键已经过期,而这个键又仍然留在数据库中,那么只要这个件不被删除,它所占用的内存就不会释放。很有可能导致内存泄漏----无用的垃圾数据占用了大量的内存。
③定期删除:每隔一段时间,程序对数据库进行一次检查,删除里面的过期键。
优缺点:定期删除策略是前两种策略的一种整合和折中:
a、定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少对CPU时间的影响。
b、通过过期删除过期键,定期删除策略有效的减少了因为过期键而带来的内存浪费
四、AOF、RDB和复制功能对过期键的处理
①生成RDB文件:在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中,因此,数据库包含过期键不会对生成新的RDB文件造成影响。
②载入RDB文件:在启动Redis服务器时,如果服务器开启了RDB功能,那么服务器将对RDB文件进行载入:
a、如果服务器以主服务器模型运行,那么在载入RDB文件时,程序会对文件中保存的键进行检查,未过期的键会被载入数据库,而过期键会被忽略
b、如果服务器以从服务器模式启动,那么在载入RDB文件时,则不会考虑键的过期,所有键会被全部载入数据库中。不过在主从服务器进行数据同步时,从服务器的数据库就会被清空。
③AOF文件写入:当服务器以AOF持久化模式运行时,如果数据库中的某个键已经过期,但它还没有被惰性删除或者定期删除,那么AOF文件不会因为这个过期键而产生任何影响。
当过期键被惰性删除或者定期删除之后,程序会向AOF文件追加一条DEL命令,来显式的记录该键被删除
④AOF重写:和生成RDB文件类似,在执行AOF重写的过程中,程序会对数据库中的键进行检查,已过期的键不会被保存到重写后的AOF文件中。
⑤主从复制
当服务器运行在复制模式下,从服务器的过期键删除动作由主服务器控制:
a、主服务器在删除一个过期键之后,会显式的向所有从服务器发送一个DEL命令,告知从服务器删除这个键
b、从服务器在执行客户端的读命令时,即使碰到过期键也不会将过期键删除,而是继续像处理未过期的键一样来处理过期键
c、从服务器只有在接到主服务器发来的DEL命令后,才会删除过期键