Redis官网说法:对于设置了过期时间的key,有2种清理机制,原文如下:

How Redis expires keys
Redis keys are expired in two ways: a passive way, and an active way. A key is passively expired simply when some client tries to access it, and the key is found to be timed out. Of course this is not enough as there are expired keys that will never be accessed again. These keys should be expired anyway, so periodically Redis tests a few keys at random among keys with an expire set. All the keys that are already expired are deleted from the keyspace. Specifically this is what Redis does 10 times per second: Test 20 random keys from the set of keys with an associated expire.
Delete all the keys found expired.
If more than 25% of keys were expired, start again from step 1.
This is a trivial probabilistic algorithm, basically the assumption is that our sample is representative of the whole key space, and we continue to expire until the percentage of keys that are likely to be expired is under 25% This means that at any given moment the maximum amount of keys already expired that are using memory is at max equal to max amount of write operations per second divided by 4.

一、被动清理:

当这个key被访问(比如:GET)时,如果发现已过期,redis会清理

二、主动清理:

2.1 大概1秒10次(即:约每100ms 执行1次)

2.2 随机抽20个key,清理20个key中的已过期项

2.3 如果清理的过期项>25%(即:>=5个),则继续上一步,随机抽下一批20个.

听上去比较合理,但是实际项目中,如果过期的key都是大key(即:占用内存很大),比例又在25%以下,又很少读取(即:被动清理、主动清理,都可能干不掉它),它们占用的内存释放会很慢,redis集群容量较少的情况下,随着key的不断写入,可能会把内存用完。

如何监控这种情况?可以用redis-rdb-tools 解析redis的rdb文件,会生成一个csv文件,里面会列出所有key的基本信息(包括key数据结构类型,大小,过期时间等)

将expiry列做下排序,如果发现该列的值,比当前时间还早,说明过期了,但是还没被清理。

有一个简单的解决办法:写一个job,定期在业务低谷时段(比如:每天凌晨),把所有大Key访问一遍即可。(即:强制触发被动删除,访问的意思,并非一定要GET,使用TTL ,EXISTS命令都可以)

redis过期机制及注意事项的更多相关文章

  1. redis过期机制

    Redis会自己回收清理不用的数据吗? 如果能,那如何配置? 如果不能,如何防止数据累加后大量占用存储空间的问题? 之前一直接触Redis不是很深入,最近项目当中遇到一个需求场景,需要清空一些存放在R ...

  2. redis过期机制(官网文档总结)

    官网地址:https://redis.io/commands/expire redis过期定义如下: Set a timeout on key. After the timeout has expir ...

  3. C# Redis 过期机制不生效问题

    引用: https://ask.csdn.net/questions/358802 根据这里的代码写出监听事件后,事件并没有生效 在比对了多次配置文件后,终于发现了一点蹊跷,在配置中不能有与之相冲的配 ...

  4. redis过期机制及排行榜

    redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略.redis 提供 6种数据淘汰策略:  volatile-lru:从已设置过期时间的数据集(server.db[i].expire ...

  5. Redis的EXPIRE过期机制介绍

    概述在实际开发过程中经常会遇到一些有时效性数据,比如限时优惠活动,缓存或者验证码之类的.过了一段时间就需要删除这些数据.在关系型数据库中一般都要增加一个字段记录数据的到期时间,然后周期性地检查过期数据 ...

  6. Redis过期--淘汰机制的解析和内存占用过高的解决方案

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Red ...

  7. redis多实例与主从同步及高级特性(数据过期机制,持久化存储)

    redis多实例 创建redis的存储目录 vim /usr/local/redis/conf/redis.conf #修改redis的配置文件 dir /data/redis/ #将存储路径配置修改 ...

  8. redis持久化机制与过期策略

    RDB的持久化策略 (快照方式,默认持久化方式): 按照规则定时将内存中的数据同步到磁盘,它有以下4个触发场景. 1. 自己配置的快照规则  vim /redis/bin/ redis.conf:按照 ...

  9. 使用Redis的五个注意事项(命名)

    原文:使用Redis的五个注意事项 下面内容来源于Quora上的一个提问,问题是使用Redis需要避免的五个问题.而回答中超出了五个问题的范畴,描述了五个使用Redis的注意事项.如果你在使用或者考虑 ...

  10. redis 过期回调通知

    redis 过期回调通知 背景 在使用redis的过程中,有时我们会遇到这种情景,当key过期的时候,我们需要去重新做一些操作,比如重新生成value等.之前,一直用的是添加一个celery定时任务, ...

随机推荐

  1. 7.9K star!跨平台开发从未如此简单,这个开源框架让APP开发效率飙升!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Lynx 是一个革命性的跨平台开发框架,使用 TypeScript 开发即可同时构建 iOS ...

  2. 毒瘤idea合集

    给定 \(n,m\) ,求: \[\sum_{i=1}^{n}\sum_{i=1}^{m}max\big(gcd(i,j)^i,lcm(i,j)^j\big) \]

  3. 【ROS】1.2 创建工作空间与功能包

    创建流程 创建文件夹A,A下创建文件夹src:mkdir -p A/src src下:catkin_init_workspace A下:catkin_make src下,创建工作包learning_p ...

  4. C#/.NET/.NET Core优秀项目和框架2025年4月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的详细介绍.功能特点.使用方式以及部分功能 ...

  5. Python单元测试标准库unittest简单学习

    1.背景 当需要测试较为复杂的module,class或者系统的功能时,如果一个一个的去测试就会显得很麻烦,如果每项测试又有一定的配置或者设置的话,比如每个测试都要新建一个对象之类的,那就更麻烦了.单 ...

  6. flutter3-deepseek流式AI模板|Flutter3.27+Dio+DeepSeeek聊天ai助手

    基于Flutter3+DeepSeek-V3+Markdown跨平台流式ai打字输出问答助手. flutter3-deepseek-chat跨平台ai流式实例,基于Flutter3.27+Dart3+ ...

  7. ESP实现Web服务器

    ESP实现Web服务器 典型的基于 ESP32 的静态网页与图片嵌入展示的 本地 Web Server(AP 模式)项目 项目功能概述 ESP32 创建一个 Wi-Fi 热点,启动一个 HTTP We ...

  8. Spring注解之@Value注解读取配置文件属性和设置默认值

    概述   在Spring 组件中,通常使用@Value注解读取 properties 文件的配置值.但如果在配置文件或启动参数中未指定对应的参数值,则项目在启动的时候会抛出异常,导致服务启动失败,异常 ...

  9. 集合操作交并补的三种Java实现

    基本概念 为了便于理解,下面首先介绍集合的三个基本操作:并集.交集和补集.   并集:以属于A或属于B的元素为元素的集合称为A与B的并(集),记作A∪B(或B∪A),读作"A并B" ...

  10. CentOS7 vsftpd服务搭建与详解

    FTP介绍 文件传输协议(File Transfer Protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件.上传文件.下载文件. FTP 基于TCP协议生成一个虚拟的连接,主要用 ...