近期面试,游走于刀锋之上,闻题:key过期如何删除,再之,数据满后何解?研习之,遂记之。
-
定时删除
设置某个key 的过期后,同时创建一个定时器,让定时器判断满足过期时间,满足立即删除。
优势: 采用立即删除,能及时进行内存清理,避免大量无效key存在内存中;
劣势:如果过期的key较多,对cpu会造成一定的压力.
-
惰性删除
key过期时, 不会立即删除, 而是在获取key时判断key是否过期, 如果过期, 获取时直接删除.
优势: 不会对cpu造成压力;
劣势: 如果较多的过期的key,没有被应用程序获取,则会一直存在与内存中, 浪费内存.
-
定期删除
间隔特定的时间段,对内存中的key进行检查,删除.
优点: 可以设置执行时间和周期, 平衡对cpu和内存的压力.
缺点: 设置不当,会退化成定时删除获取惰性删除;
如果执行的周期过长, 会导致key过期, 还未删除, 但是业务需要获取key得到了过期的数据.
-
Redis中,如果存入数据量过多,内存满了,如何处理?
Redis作为内存数据库, 如果内存超出设置的最大内存数, 此时会触发内存淘汰机制.
配置文件中的maxmemory可以设置redis的最大内存大小
-
volatile-lru 利用LRU(最近使用:Least Recently Used)算法,移除设置过过期时间的key;
-
allkeys-lru 利用LRU算法移除任何key(包括没有设置过期时间的key) ;
-
volatile-random 移除设置过过期时间的随机key ;
-
allkeys-random 无差别的随机移除 ;
-
volatile-ttl 移除即将过期的key(minor TTL) ;
-
noeviction 不移除任何key,只是返回一个写错误。
配置文件中的maxmemory-policy可以设置淘汰方式
-