Redis 内存管理策略

背景

Redis很多时候都是在使用内存,数据一直写,但内存是有限的,如果Redis内存满了,那么我们的很多缓存操作都会超时、失败,接着可能会引发雪崩。那么当内存达到阀值Redis是怎么处理的呢?

配置内存限制maxmemory

我们可以通过在配置文件中配置maxmemory来限制内存的最大使用情况。如果maxmemory为0则表示无限制。 在redis.cn中配置如下配置:

maxmemory 1000mb //配置内存限制为1G

默认的当内存达到我们配置的指定大小时会返回错误,异常为OOM异常,即已经没有足够的内存供试用。这是因为默认情况下Redis是不选择任何内存回收策略的。

配置内存回收策略

当内存达到最大限制时触发内存回收策略。我们可以通过maxmemory-policy来指定内存回收策略。 例如:maxmemory-policy volatile-ttl

Redis内置的策略种类

noeviction: 禁止驱逐数据(默认);当内存达到限制时并且客户端尝试执行一些消耗内存的命令时返回错误,即OOM异常。 **allkeys-lru:**尝试回收最少使用的键 **volatile-lru:**尝试回收最少使用的键,但仅限于在已设置过期集合的键。 allkeys-random: 回收随机的键 **volatile-random:**回收随机的键,仅限于在已设置过期集合的键。 **volatile-ttl:**回收过期集合的键,并且优先回收存活时间较短的键,使得新添加的数据有地方可存放。

4.x引入的策略

从redis4.0开始引入了一个新的策略模式:LFU全称:Least Frequently Used。即最近很少使用。 两种策略:volatile-lfuallkeys-lfu

volatile-lfu: 在已设置过期的数据集中选择最不常使用的数据淘汰 allkeys-lfu: 从数据集中挑选最近最不常使用的数据淘汰。

回收进程如何工作

当客户端运行了一个新的命令,添加了新的数据 Redis检查内存使用情况 ,如果大于maxmemory的限制,则根据设定好的策略进行回收 新的命令被执行。。。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Redis持久化RDB和AOF实现原理

Redis持久化RDB和AOF为什么Redis需要持久化?因为Redis属于内存型数据库,数据是储存在内存当中的,当遇到不可抗力因素,比如断电,那么储存在内存中的数据就会丢失。所以为了保证数据的完整性,我们需要做持久化操作,来保证数据的完整性。Redis中都有哪些持久化机制?Redis早

Redis的分片机制包含对一致性HASH算法的运用

前言:大家都知道redis单台的默认内存大小一般是10M.如果现在需要我们将1G的数据保存到内存中。这该如何做到呢?比如我们就用单台redis,但是一味的扩大单台redis内存则直接影响执行的效率,会有一种得不偿失的感觉。于是呢,我们就得采用分片策略实现数据保存,通过多台redis共同为用户提供内存得支持,实现内存扩容,提高执行效率!!

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid