redis过期key的删除策略介绍

2025-04-24 05:50

本文主要是介绍redis过期key的删除策略介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教...

在使用Redis的过程中,不免会产生过期的key,而这些key过期后并不会实时地马上被删除,当这些key数量累积越来越多,就会占用很多内存,因此在redis底层同时使用了三种策略来删除这些key。

第一种策javascript略:被动删除

当读/写一个key时,redis首先会检查这个key是否存在,如果存在且已过期,则直接删除这个key并返回nil客户端。

第二种策略:定期删除

redis中有一系列的定期任务(serverCron),这些任务每隔一段时间就会运行一次,其中就包含清理过期key的任务,运行频率由配置文件中的hz参数来控制,取值范围1~500,默认是10,代表每秒运行10次。

清理过程如下:

  1. 遍历所有的db
  2. 从db中设置了过期时间的key的集合中随机检查20个key
  3. 删除检查中发python现的所有过期key
  4. 如果检查结果中25%以上的key已过期,则继续重复执行步骤2-3,否则继续遍历下一个db

调大hz将会提高redis定期任务的执行频率,如果你的redis中包含很多过期key的话,可以考虑将这个值调大,但要注意同时也会增加CPU的压力,redis作者建议这个值不要超过100。

第三种策略:强制删除

如果redis使用的内存已经达到maxmemory配置的值时,会触发强制清理策略,清理策略由配置文件的maxmemory-policy参数来控制

有以下这些清理策略:

  • volatile-lru:使用LRU算法对设置了过期时间的key进行清理(默认值)
  • allkeys-lru:使用LRU算法对所有key进行清理
  • volatile-lfu:使用LFU算法对设置了过期时间的key进行清理(redis 4.0版本开始支持)
  • allkeys-lfu:使用LFU算法对所有key进行清理(redis 4.0版本开始支持)
  • volatile-random:对所有设置了过期时间的key进行随机清理
  • allkeys-random:从所有key进行随机清理
  • volatile-ttl:清理生存时间最小的一部分key
  • noeviction:不做任何清理,拒绝执行所有的写操作(如果需要保证数据的完整性,可以选择这个)

为了节省内存和性能上的考虑,上述的清理策略都不需要遍历所有数据,而是采用随机采样的方法,每次随机取出特定数量(由mChina编程axmemory-samples配置项控制,默认是5个)的key,然后在这些key中执行LRU算法、RANDOM算法、或者是找出TTL时间最小的一个key,然后进行删除。

注:这个清理过程javascript是阻塞的,直到清理出足够的内存空间才会停止。

关于big key的清理

在删除元素数量很多的集合(set/hash/list/sortedSet)时,China编程无论是使用DEL命令删除还是redis为了释放内存空间而进行的删除,在删除这些big key的时候,会导致redis主线程阻塞。为了解决这个问题,在redis 4.0版本中,提供了lazy free(懒惰删除)的特性。

使用lazy free删除big key时,和一个O(1)指令的耗时一样,亚毫秒级返回,然后把真正删除key的耗时动作交由bio后台子线程执行。

UNLINK命令

UNLINK命令是与DEL一样删除key功能的lazy free实现。

唯一不同的是,UNLINK在删除集合类型的键时,如果集合键的元素个数大于64个,会把真正的内存释放操作,交给单独的后台线程来操作,使用示例:

127.0.0.1:6379> UNLINK mylist
(integer) 1

FLUSHALL/FLUSHDB命令

FLUSHALL/FLUSHDB命令也有lazy free的实现,在命令后加上ASYNC关键字就可以,使用示例:

127.0.0.1:6379> FLUSHALL ASYNC

lazy free相关配置项

与lazy free相关的配置项有以下这些,默认值都是no,即关闭。

lazyfree-lazy-eviction

针对redis内存使用达到maxmemory,并设置有淘汰策略时,在淘汰键时是否采用lazy free机制。

注:如果此场景开启lazy free,可能会使淘汰键的内存释放不及时,导致redis不能迅速将内存使用下降到maxmemory以下。

lazyfree-lazy-expire

针对设置有过期时间的key,达到过期后,被redis清理删除时是否采用lazy free机制,此场景建议开启。

lazyfree-lazy-server-del

针对有些命令在处理已存在的键时,会带有一个隐式的DEL键的操作。如RENAME命令,当目标键已存在,redis会先删除目标键,如果这些目标键是一个big key,那就会出现阻塞的性能问题。 此参数设置就是解决这类问题,建议开启。

slave-lazy-flush

针对slave进行全量数据同步,slave在加载master的RDB文件前,会运行FLUSHALL来清理自己的数据场景。

参数设置决定是否采用lazy free flush机制。如果内存变动不大,建议可开启。可减少全量同步耗时,从而减少主库因输出缓冲区爆涨引起的内存使用增长。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程China编程(www.chinasem.cn)。

这篇关于redis过期key的删除策略介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154347

相关文章

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)

《MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)》掌握多表联查(INNERJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN)和子查询(标量、列、行、表子查询、相关/非相关、... 目录第一部分:多表联查 (JOIN Operations)1. 连接的类型 (JOIN Types)

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

Redis指南及6.2.x版本安装过程

《Redis指南及6.2.x版本安装过程》Redis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSIC语言编写、支持网络、... 目录概述Redis特点Redis应用场景缓存缓存分布式会话分布式锁社交网络最新列表Redis各版本介绍旧

Java如何从Redis中批量读取数据

《Java如何从Redis中批量读取数据》:本文主要介绍Java如何从Redis中批量读取数据的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一.背景概述二.分析与实现三.发现问题与屡次改进3.1.QPS过高而且波动很大3.2.程序中断,抛异常3.3.内存消

Redis中的Lettuce使用详解

《Redis中的Lettuce使用详解》Lettuce是一个高级的、线程安全的Redis客户端,用于与Redis数据库交互,Lettuce是一个功能强大、使用方便的Redis客户端,适用于各种规模的J... 目录简介特点连接池连接池特点连接池管理连接池优势连接池配置参数监控常用监控工具通过JMX监控通过Pr