关于Redis的内存淘汰策略详解

Redis内存淘汰策略详解

在Redis中,内存淘汰策略是控制内存的一个重要机制。如果Redis占用的内存超过了系统的RAM容量,就会选择一些策略来强制淘汰一些数据。Redis提供了多种内存淘汰策略,下面就详细介绍一下这些策略。

noeviction

noeviction策略是默认的策略,当内存不足用于新的建议(新建的键),旧键不会被驱逐(eviction),新值插入操作会返回错误。在这种策略下,Redis无法插入新的键值对,可能会导致新数据写入失败。以下是noeviction策略的配置方式:

config set maxmemory-policy noeviction

volatile-lru

该策略会优先驱逐设置了过期时间(TTL)的键(key),并且在这些带有过期时间的键(key)中优先驱逐最近最少使用的(least recently used,LRU)键(key)。如果没有符合上述条件的内存块,则按照随机的策略随机选择需要被驱逐的键(key)。

以下是volatile-lru策略的配置方式:

config set maxmemory-policy volatile-lru

volatile-ttl

该策略会优先驱逐剩余时间(TTL)较短的键(key),并且在这些键(key)中相同的键会优先驱逐过期时间(TTL)较短的键(key),如果没有符合上述条件的内存块,则按照随机的策略选择需要被驱逐的键(key)。以下是volatile-ttl策略的配置方式:

config set maxmemory-policy volatile-ttl

volatile-random

该策略会随机驱逐过期时间(TTL)较短的键,这些键的过期时间相同时,按照随机的策略选择需要被驱逐的键。如果没有符合上述条件的内存块,则按照随机的策略选择需要被驱逐的键(key)。

以下是volatile-random策略的配置方式:

config set maxmemory-policy volatile-random

示例说明:

以下是一个示例,说明LRU算法如何工作。请先创建一个测试集合(key1, key2, key3),设置maxmemory为2Mbytes,驱逐策略为volatile-lru,设置key1的过期时间为5秒后。

redis-cli flushall
redis-cli config set maxmemory 2mb
redis-cli config set maxmemory-policy volatile-lru
redis-cli set key1 value1
redis-cli set key2 value2
redis-cli set key3 value3
redis-cli expire key1 5

在上述代码中,key1是一个带有过期时间TTL的键,5秒后过期,Redis会驱逐掉最近最少使用的键(key)来释放空间。此时,再向Redis中加入一个新的键(key4),由于maxmemory为2Mbytes,且当前已经占用2Mbytes空间,所以插入key4时将会返回如下错误:

(error) OOM command not allowed when used memory > 'maxmemory'

另外一个示例是当我们将maxmemory策略修改为noeviction时,插入新键(key4)将会失败:

redis-cli config set maxmemory-policy noeviction
redis-cli set key4 value4

在exec该命令之后,会返回如下错误:

(error) OOM command not allowed when used memory > 'maxmemory'

这是因为使用noeviction策略时,Redis不会被驱逐任何一个键(key)以便为新的键(key)释放空间,因此当空间不足时Redis会拒绝新建任何键的请求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Redis的内存淘汰策略详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • SQL中 decode()函数简介

    介绍 decode() 是SQL中非常强大的条件表达式函数之一。它被广泛用于在查询中测试和显示一个字段的不同值。decode()函数本质上是一个语言结构,它接受若干个条件和结果,对于输入数据的每一个值,按照顺序依次判断是否满足条件,如果满足,则返回对应的结果。 语法 decode() 函数的语法如下: decode( expression ,search ,…

    database 2023年5月21日
    00
  • Linux关于透明大页机制的介绍

    下面就为大家详细讲解“Linux关于透明大页机制的介绍”的完整攻略。 什么是透明大页? 透明大页是Linux内核提供的一种大页机制。透明大页主要是针对多进程应用程序,通过将多个小页映射到同一个物理页框中,降低页表项的数量和TLB(快表)的负载,从而提高应用程序的性能。 如何启用透明大页? Linux内核4.0及以上版本自带了透明大页的支持,如果要启用透明大页…

    database 2023年5月21日
    00
  • Java中Validated、Valid 、Validator区别详解

    Java中Validated、Valid 、Validator区别详解 背景介绍 在Java中,我们经常会使用各种注解来实现校验的功能。其中,@Valid、@Validated和Validator三种方式是比较常用的。本文将详细讲解它们的区别。 @Validated与@Valid注释 @Validated和@Valid注释是两种校验注释。它们的职责是调用验证…

    database 2023年5月21日
    00
  • MySQL时间字段究竟使用INT还是DateTime的说明

    MySQL时间字段通常可以使用INT类型或者DateTime类型来存储,这两种方式各有优缺点,需要根据具体情况来选择使用合适的类型。 INT类型的使用 INT类型通常用于存储时间戳,即距离1970年1月1日0点0分0秒的秒数。这种方式在存储和计算时间时具有一定的优势。首先,它是一个整数,没有日期的干扰,在计算时更加方便。其次,INT类型的字段通常需要的存储空…

    database 2023年5月22日
    00
  • php连接微软MSSQL(sql server)完全攻略

    PHP连接微软MSSQL是一项非常常见的任务,但一些开发人员可能会有一些困难,因为两个不同的技术栈可以相互交互,因此可能需要一些额外的配置和处理。本文将完整介绍连接微软MSSQL的过程和所需的所有步骤。 前提条件 在开始与MSSQL进行连接之前,我们需要确保已经安装了以下软件: PHP Microsoft SQL Server驱动程序 Microsoft O…

    database 2023年5月22日
    00
  • HBase 和 MongoDB 的区别

    HBase和MongoDB都是非关系型数据库中非常有影响力的代表。虽然都是NoSQL数据库,但它们之间有些明显的差别。 HBase和MongoDB的概述 HBase是一个分布式的、可扩展的、由Java编写的列存储数据库,是Google的Bigtable的一个开放源代码实现。在Hadoop生态系统中作为Hadoop的一部分存在,可以用于非常大的数据集,适用于金…

    database 2023年3月27日
    00
  • MySQL中DATE_FORMAT()函数将Date转为字符串

    MySQL中DATE_FORMAT()函数是将DATE类型字段格式化为指定的日期格式。它的语法如下: DATE_FORMAT(date,format) 其中,date是日期值,format是指定的格式化字符串。下面是几个常用的日期格式化代码: 代码 说明 %Y 年(4位数字) %m 月(01~12) %d 日(01~31) %H 小时(00~23) %i 分…

    database 2023年5月22日
    00
  • 【数据库】9.0 MySQL入门学习(九)——获得数据库和表的信息、日期计算、查询、选择特殊列

    1.0 SELECT语句用来从数据表中检索信息。   SELECT what_to_select FROM which_table WHERE conditions_to_satisfy; what_to_select指出你想要看到的内容,可以是列的一个表,或*表示“所有的列”。 which_table指出你想要从其检索数据的表。 WHERE子句是可选项,如…

    MySQL 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部