Redis淘汰删除策略

Redis淘汰删除策略

6种淘汰Key策略

Redis中经过maxmemory参数来设定内存的使用上限,当Redis使用内存达到设定的最大值的时候,会根据配置文件中的策略选取要删除的key来删除,从而给新的键值留出空间;服务器

目前Redis提供了6种的淘汰策略(默认的是noeviction):dom

  • volatile-lru,在设置了过时时间的键空间中,移除最近最少使用的key;性能

  • allkeys-lru,移除最近最少使用的key;优化

  • volatile-random,在设置了过时时间的键空间中,随机移除一个key;spa

  • allkeys-random,随机移除一个key;code

  • volatile-ttl,在设置了过时时间的键空间中,移除将要过时的key;进程

  • noeviction,当内存使用达到阀值的时候,全部引发申请内存的命令会报错;内存

3种删除过时键策略

前面咱们知道须要淘汰掉哪些过时Key,可是咱们应该怎么去淘汰这些过时key呢?有3种删除的操做策略:资源

定时删除

在设置键的过时时间的同时,建立一个定时器,让定时器在键的过时时间来临时,当即执行对键的删除操做;

定时删除操做对于内存来讲是友好的,内存不须要操做,而是经过使用定时器,能够保证尽快的将过时键删除,可是对于CPU来讲不是友好的,若是过时键比较多的话,起的定时器也会比较多,删除的这个操做会占用到CPU的资源;

惰性删除

听任键过时无论,可是每次从键空间中获取键是,都检查取得的键的过时时间,若是过时的话,删除便可;

惰性操做对于CPU来讲是友好的,过时键只有在程序读取时判断是否过时才删除掉,并且也只会删除这一个过时键,可是对于内存来讲是不友好的,若是多个键都已通过期了,而这些键又刚好没有被访问,那么这部分的内存就都不会被释放出来;

按期删除

每隔一段时间,程序就对数据库进行一次检查,删除掉过时键;

按期删除是上面两种方案的折中方案,每隔一段时间来删除过时键,并经过限制删除操做执行的时长和频率来减小删除操做对CPU时间的影响,除此以外,还有效的减小内存的浪费;可是该策略的难点在于间隔时长,这个须要根据自身业务状况来进行设置;

目前,Redis采用的是惰性删除+按期删除的方案;

其余模块的淘汰处理

目前Redis提供了两种持久化方式,分别是RDB和AOF;

RDB 快照持久化

建立

RDB是经过建立快照获取内存中的数据在某一个时间点上的数据的副本;有两个命令能够建立RDB文件,分别是SAVEBGSAVE,二者的区别在因而否阻塞进程去建立RDB文件,这两个命令都不会将数据空间中的过时键给保存到RDB文件中

载入

在启动Redis服务器时,若是服务器开启了RDB文件,那么服务器就会对RDB文件进行载入,须要注意⚠️的是:

  • 若是当前服务器是Master,那么过时键将会被忽略,不会载入到主服务器中;

  • 若是当前服务器是Slave,文件中全部键,不过是否过时都会被载入到从服务器中;

AOF 只追加持久化

写入

数据库中的过时键没有被删除时,其不会对AOF文件有任何的影响;当过时键被删除之后,程序会向AOF文件追加一条DEL命令,显示记录该键已经被删除;

重写

AOF是将执行的写命令添加到AOF文件的末尾来记录数据的变化;为了不文件被添加得愈来愈大,甚至有可能用完硬盘的全部空间,所以Redis提供了Rewrite的优化策略,分别是REWRITEAOFBGREWRITEAOF,两个命令的区别也是在因而否阻塞主进程,这两个命令都不会将数据空间中的过时键给保存到AOF文件中

主从复模式下对过时键的处理

一般在主从模式下,主服务器来读取写命令,从服务器用来读取读命令,分担主服务器的压力(与那种持久化模式无关),须要注意⚠️的是:

  • 若是当前服务器是Slave的话,若是有命令读取当前过时键的话,不会惰性删除,由于这会影响读取的性能,所以不会删除,而且返回过时键对应的值;除非是Master服务器同步告知Slave服务器须要删除过时键才会删除;

  • 若是当前服务器是Master的话,当服务器经过策略得知某个键过时,则将该过时键给删除,而且同步给其余从服务器让它们删除掉该键;

相关文章
相关标签/搜索