Redis淘汰删除策略

6种淘汰Key策略

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

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

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

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

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

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

  • 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的话,当服务器通过策略得知某个键过期,则将该过期键给删除,并且同步给其他从服务器让它们删除掉该键;

Redis淘汰删除策略的更多相关文章

  1. Redis 键的过期删除策略及缓存淘汰策略

    前言 Redis缓存淘汰策略与Redis键的过期删除策略并不完全相同,前者是在Redis内存使用超过一定值的时候(一般这个值可以配置)使用的淘汰策略:而后者是通过定期删除+惰性删除两者结合的方式进行内 ...

  2. redis 的过期策略都有哪些?内存淘汰机制都有哪些?

    面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当然的认为写进 r ...

  3. redis中key的过期键删除策略

    Redis过期键删除策略 Redis key过期的方式有三种: 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key 主动删除:由于惰性删除策略无法保证冷数据被及时删 ...

  4. redis的过期策略以及内存淘汰机制

    redis采用的是定期删除+惰性删除策略. 为什么不用定时删除策略? 定时删除,用一个定时器来负责监视key,过期则自动删除.虽然内存及时释放,但是十分消耗CPU资源.在大并发请求下,CPU要将时间应 ...

  5. redis删除策略

    redis 设置过期时间 Redis 中有个设置时间过期的功能,即对存储在 redis 数据库中的值可以设置一个过期时间.作为一个缓存数据库,这是非常实用的.如我们一般项目中的 token 或者一些登 ...

  6. 4.redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?

    作者:中华石杉 面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当 ...

  7. Redis中删除过期Key的三种策略

    转载自:http://blog.csdn.net/a_bang/article/details/52986935?locationNum=9&fps=1 项目中有个接口要频繁调用查询数据库中的 ...

  8. redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现?

    redis的过期策略都有哪些? 设置过期时间: set key 的时候,使用expire time,就是过期时间.指定这个key比如说只能存活一个小时?10分钟?指定缓存到期就会失效. redis的过 ...

  9. 关于redis的几件小事(四)redis的过期策略以及内存淘汰机制

    1.数据为什么会过期? 首先,要明白redis是用来做数据缓存的,不是用来做数据存储的(当然也可以当数据库用),所以数据时候过期的,过期的数据就不见了,过期主要有两种情况, ①在设置缓存数据时制定了过 ...

随机推荐

  1. ORACLE -- ArcSDE Lock request conflicts with an established lock【转】

    具体的解决办法有如下三种 1.多半情况下关闭数据库连接可以解决这个问题,但有时候问题依然存在. 2. >1.关闭所有的ArcMap和ArcCatalog session. >2.开始——运 ...

  2. Swift-11-协议(Protocols)

    协议定义了一个蓝图,规定了用来实现某一特定工作或者功能所必须的方法和属性.类.结构体或者枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能.任意能满足协议要求的类型被称为遵循confor ...

  3. AJAX文档

    AJAX 文档 AJAX开发简略.................................................................................... ...

  4. Spring Boot 属性配置和使用

    Spring Boot 属性配置和使用 Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot ...

  5. jquery水印插件:placeholder

    jquery水印插件:placeholder 有的浏览器支持html5的水印placeholder(如Crome,firefox,ie10+),有的不支持html5的placeholder(ie9,i ...

  6. react组件中的constructor和super小知识

    react组件中的constructor和super小知识 1.react中用class申明的类一些小知识 如上图:类Child是通过class关键字申明,并且继承于类React. A.Child的类 ...

  7. 结合sklearn的可视化工具Yellowbrick:超参与行为的可视化带来更优秀的实现

    https://blog.csdn.net/qq_34739497/article/details/80508262 Yellowbrick 是一套名为「Visualizers」的视觉诊断工具,它扩展 ...

  8. Echarts使用及动态加载图表数据 折线图X轴数据动态加载

    Echarts简介 echarts,缩写来自Enterprise Charts,商业级数据图表,一个纯JavaScript的图表库,来自百度...我想应该够简洁了 使用Echarts 目前,就官网的文 ...

  9. [转]Java. SqlServer 使用

    public void add(Emp emp) throws Exception { String connectionUrl = "jdbc:sqlserver://localhost: ...

  10. pyhon模块之日志模块

    #Auther Bob#--*--coding:utf-8--*-- import logging #python一共有5个级别的日志,debug.info.warning.error.critica ...