当前位置: 首页 > article >正文

【redis】过期策略 懒惰删除

过期删除:

redis会将所有设置过期时间的key以及过期时间存储在字典里。
redis采取两个策略实现删除过期key:
1、定时删除:定期扫描字典,采用贪心的策略,从字典随机抽20个key,删除其中已经过期的key,如果过期的key超过1/2,那么重复上述步骤。当有大量key同时过期,为了避免无限循环扫描,这一个定时删除的任务的时间上限是25ms,但是即使有这个时间上限,仍然会出现积少成多的卡顿。(比如频繁回收内存页,定时任务每次持续25ms)。为了解决这个大量key同时过期带来的卡顿现象,应该将key的过期时间设置随机范围。这样就可以避免同时过期。
2、惰性删除:当客户访问key时,redis就会对key进行过期检查,如果过期,就会立即删除这个key。
 
以上删除都是默认在主线程中删除,redis4.0后可以将同步删除改成异步删除。通过命令lazyfree-lazy-expire yes开启。

懒惰删除:

redis4.0引入懒惰删除,
懒惰删除的命令是: unlink key
所谓懒惰删除就是同步线程转为异步线程。让后台线程来执行删除。
其后台删除过程主要是通过空间换时间的思想设计的:
1、首先从全局字典中移除 Key 的指针引用,此时值对象(如 String/Hash/List)仍保留在内存中,但已无任何引用路径。
2、对象移入异步队列(主线程操作)【短暂的内存占用】
3、BIO 线程从队列取出对象,执行 freeObject() 释放内存。此时才是真正的内存回收点
在这个过程中不会有线程安全问题 :
Redis 使用 原子操作(atomic) 移除全局字典的指针。当移除key的指针引用后,key会被立即删除,但是值对象仍在内存中,并且主线程无法再访问这个值对象。 

http://www.lryc.cn/news/2401172.html

相关文章:

  • Docker或Docker-Compose时间时区配置
  • 如何在IDE中通过Spark操作Hive
  • ToolsSet之:XML工具
  • keepalived定制日志bug
  • ElasticSearch+Gin+Gorm简单示例
  • 数据库系统概论(十三)详细讲解SQL中数据更新(插入,修改与更新)
  • JVMTI 在安卓逆向工程中的应用
  • 极客时间-《搞定音频技术》-学习笔记
  • 网络攻防技术十三:网络防火墙
  • Express 集成Sequelize+Sqlite3 默认开启WAL 进程间通信 Conf 打包成可执行 exe 文件
  • CppCon 2015 学习:A C++14 Approach to Dates and Times
  • 基于CNN的OFDM-IM信号检测系统设计与实现
  • macos常见且应该避免被覆盖的系统环境变量(避免用 USERNAME 作为你的自定义变量名)
  • 2024年认证杯SPSSPRO杯数学建模D题(第二阶段)AI绘画带来的挑战解题全过程文档及程序
  • 深入理解CSS常规流布局
  • DOCKER使用记录
  • MYSQL中常见的函数和使用
  • 【深度学习相关安装及配环境】Anaconda搭建虚拟环境并安装CUDA、cuDVV和对应版本的Pytorch,并在jupyter notebook上部署
  • web3-区块链基础:从区块添加机制到哈希加密与默克尔树结构
  • TCP小结
  • django ssh登录 并执行命令
  • unix/linux,sudo,其高级使用
  • Python 打包指南:setup.py 与 pyproject.toml 的全面对比与实战
  • 计算机视觉与深度学习 | 基于OpenCV的实时睡意检测系统
  • python打卡day44@浙大疏锦行
  • 性能优化 - 案例篇:缓存_Guava#LoadingCache设计
  • NiceGUI 是一个基于 Python 的现代 Web 应用框架
  • 生动形象理解CNN
  • python入门(1)
  • 【PDF提取表格】如何提取发票内容文字并导出到Excel表格,并将发票用发票号改名,基于pdf电子发票的应用实现