Redis的过期策略和内存淘汰机制
时间:2021-07-14
本文章向大家介绍Redis的过期策略和内存淘汰机制,主要包括Redis的过期策略和内存淘汰机制使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一.Redis过期策略
1. 设置过期命令
expire设置生存时间
expireat设置过期时间点(时间戳)
2. key的3种过期策略
(1)定时删除:在设置过期时间的同时,设置一个定时器,定时器的执行时间就是过期的时间点。 优点:对内存最友好,过期的键会以最快的被删除,释放内存。 缺点:对CPU时间最不友好,在大量键设置过期时间时,会创建大量的定时器,执行浪费CPU时间。
(2)惰性删除:不管键是否过期,只有每次取值的时候,才检查是否过期,过期就删除。 优点:对CPU时间最友好,取值时检查,只对当前键操作,不影响其他。 缺点:对内存不友好,可能会存在大量过期的未被使用的键值没有删除,无用数据占用了大量内存。
(3)定期删除:每隔一段时间,程序对数据库进行一次检查,过期的就删除。 优点:前两种方案的折中,通过减少执行频率来减少对CPU时间的影响,通过定期删除减少了对内存的浪费。 缺点:执行频率需要掌握好,不然太频繁则退化成定时删除,太少则退化成惰性删除。
3.Redis默认采用的是惰性删除和定期删除两种策略
定期删除:指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除
惰性删除:在你获取某个key的时候,redis会检查一下 ,这个key如果设置了过期时间那么是否过期了,如果过期了此时就会删除,不会给你返回任何东西
4.持久化和主从复制对过期键的处理
(1)RDB持久化 写入rdb文件:程序会对过期键进行检查, 过期键不写入 加载rdb文件:如果以主服务器模式运行,程序会对文件中保存的键进行检查,仅加载未过期的键,而过期键则会忽略; 如果以从服务器模式运行, 不会检查是否过期,数据都会载入(过期键会通过与主服务器同步而删除)
(2)AOF持久化 AOF文件写入时,键已过期但未删除,不影响;键过期已删除,则在AOF文件后追加一条DEL命令。 AOF重写过程中, 程序会对数据库中的键进行检查,过期的键会忽略, 不会被保存到重写后的aof文件中。
(3)主从复制 主从模式下,由主服务器进行删除过期键,并显示的向从服务器发送DEL命令; 从服务器自身不具备删除过期键值行为, 它的过期删除动作由主服务器控制 (从服务器只有在接到主服务器发来的del命令后,才会删除过期键)。
二.Redis内存淘汰机制
1. 概念
当Redis的内存使用达到设置的内存上限时就会触发内存淘汰机制(用户存储的一些键被可以被Redis主动地从实例中删除),按照特定的淘汰算法进行数据清理,释放内存
2. 配置方式
我们通过配置redis.conf中的maxmemory这个值来开启内存淘汰功能(maxmemory为0的时候表示我们对Redis的内存使用没有限制)
我们通过配置redis.conf中的maxmemory-policy来指定淘汰策略(默认是noeviction策略)
3. 8种内存淘汰策略(默认noeviction)
noeviction: 不淘汰,在redis的内存超过限制之后,新的写入会报错, 读操作正常运行
allkeys-lru:LRU算法,内存不足时,在所有key中淘汰最近最少使用的key allkeys-lfu: 内存不足时,在所有key中淘汰使用频次最少的key allkeys-random:随机,内存不足时,在所有key中随机选择一个key淘汰
volatile-lru:内存不足时,在设置了过期时间的key中,淘汰最近最少使用的key volatile-lfu: 内存不足时,在设置了过期时间的key中,淘汰使用频次最少的key volatile-random:内存不足时,在设置了过期时间的key中,随机选择一个key淘汰 volatile-ttl:内存不足时,在设置了过期时间的key中,选择即将要过期的key淘汰
原文地址:https://www.cnblogs.com/Baker-Street/p/15012067.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RecyclerView+PagerSnapHelper实现抖音首页翻页的Viewpager效果
- android中使用react-native设置应用启动页过程详解
- 面试官问我单例模式真的安全吗?我懵逼了
- 详解Android使用CoordinatorLayout+AppBarLayout实现拉伸顶部图片功能
- Android自定义控制条效果
- Android使用MediaPlayer和TextureView实现视频无缝切换
- Android实现静默拍照功能
- Android实现动态体温计
- Android实现倾斜角标样式
- 浅谈Flutter 中渐变的高级用法(3种)
- Android实现左上角(其他边角)倾斜的标签(环绕效果)效果
- Android开发中Button组件的使用
- Android开发之基于RecycleView实现的头部悬浮控件
- Android如何通过命令行操作Sqlite3数据库的方法
- Android实现沉浸式状态栏功能