Redis 过期策略+conf 记录

article/2025/9/14 9:45:01

一:redis的过期策略

三种过期键删除策略
1)定时删除:创建一个定时器,到时间立即执行删除操作(对内存友好,因为能保证过期了立马删除,但是对cpu不友好)

2)惰性删除:键过期不管,每次获取键时调用expireIfNeeded()方法检查是否过期,过期就删除,并返回不存在(对cpu友好,但是只有在使用的时候才可能删除,对内存不友好)

3)定期删除:Redis 默认会每秒进行 10 次(redis.conf 中通过 hz 配置)过期扫描

Redis会通过执行定期任务来主动清除过期key,执行过程如下:

  1. 从设置了过期时间的key的集合中随机检查20【Redis参数,默认是20】个key
  2. 删除检查中发现的所有过期key。
  3. 如果检查结果中25%以上的key已过期,则重复1,2
  4. (

    每秒钟执行server.hz次serverCron()方法serverCron()调用databasesCron(),databasesCron()调用activeExpireCycle()

    activeExpireCycle()对每个expires[*]逐一进行检测,每次执行250ms/server.hz,其中expires[*]表示redis数据库的过期数据信息内存块

    )

1:检查结果中25%以上的key已过期,Redis就会循环扫描多次删除以释放内存空间,注意,删除操作时阻塞(Redis 4.0 后可以用异步线程机制(BIO)来减少阻塞影响)。所以一旦该条件触发,Redis的线程就会一直执行删除,就会无法正常服务其他键值对操作,进一步引起其他键值操作的延迟增加,Redis就会变慢。

2:如果过期key数量很多或者增加速度很快,而Redis的主动清除频率较低,过期key将占用大量的内存空间,可能会影响Redis服务的性能。适当调整hz参数的值,提高清除频率

3:为了保证扫描不会出现循环过度,导致线程卡死现象,还增加了扫描时间的上限,默认是 25 毫秒,所以客户端设置的超时时间不能小于 25 毫秒,否则就会导致链接因为超时而关闭,就会造成异常

Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务器可以很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡。Redis默认每隔100ms随机抽取一些设置了过期时间的key,检查是否过期,如果过期就删除

二:内存淘汰机制

Redis 的内存占用会越来越高。Redis 为了限制最大使用内存,提供了 redis.conf 中的 配置参数 maxmemory。当内存超出 maxmemory,Redis 提供了几种内存淘汰机制让用户选择,配置 maxmemory-policy:

  • noeviction:当内存超出 maxmemory,写入请求会报错,但是删除和读请求可以继续。
  • allkeys-lru:当内存超出 maxmemory,在所有的 key 中,移除最少使用的key。只把 Redis 既当缓存是使用这种策略。
  • allkeys-random:当内存超出 maxmemory,在所有的 key 中,随机移除某个 key。
  • volatile-lru:当内存超出 maxmemory,在设置了过期时间 key 的字典中,移除最少使用的 key。把 Redis 既当缓存,又做持久化的时候使用这种策略。
  • volatile-random:当内存超出 maxmemory,在设置了过期时间 key 的字典中,随机移除某个key。
  • volatile-ttl:当内存超出 maxmemory,在设置了过期时间 key 的字典中,优先移除 ttl 小的

逐出算法
redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNedded()检测内存是否充足,如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间,清理数据的策略称为逐出算法
逐出数据的过程不是100%能够清理出足够的可使用的内存空间的,如果不成功则反复执行,当对所有数据尝试完毕后,如果不能达到内存中的存储要求,将报错


三:基本配置了解

cd /usr/local/redis/bin  ,./redis-cli -h 172.19.0.1 -p 6379

查看redis的内存淘汰机制:config get maxmemory-policy 

redis.conf 

hz 10

(调整Redis定期任务的执行频率

通过修改hz参数的值,您可以调整Redis执行定期任务的频率,从而改变Redis清除过期key、清理超时连接的效率)

为了定期检测资源和服务状态并根据预定策略执行相应的操作,Redis调用一个内部函数来执行多种后台任务,例如:

  • 计算LRU信息并清除过期key。
  • 关闭超时的客户端连接。
  • 整理hash类型的数据。
  • 执行RDB或AOF持久化相关操作。
  • 更新统计信息

这些定期任务是Redis服务正常运行的保障,它们的执行频率由hz参数的值指定,默认为10,即每秒执行10次

databases 16

Redis默认支持16个数据库,这可以通过修改Redis的配置文件/redis/redis.conf中的databases字段的值,设置完毕并重启Redis即可完成配置。

此外,客户端与Redis建立连接之后,默认会选择0号数据库即db0,但可以使用select命令更换存储的数据库

一般springboot使用配置:

spring.redis.database=0
spring.redis.host=172.66.20.1
spring.redis.port=6379
spring.redis.timeout=2000

daemonize no

Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 # 启用守护进程后,Redis会把pid写到一个pidfile中,在/var/run/redis.pid

save 900 1
save 300 10
save 60 10000

满足以下条件将会同步数据:
#   900秒(15分钟)内有1个更改,则持久化1次
#   300秒(5分钟)内有10个更改,则持久化1次
#   60秒内有10000个更改,则持久化1次

stop-writes-on-bgsave-error yes

默认值为yes,进行 RDB 备份文件生成过程中遭遇错误,是否停止 redis 提供写服务

备份过程中redis 会fork一个新的后台进程dump rdb(异步执行,不影响主进程后续命令执行)。但Fork子进程,涉及父进程的内存复制,会增加服务器内存开销,比如:如果主进程使用了2GB的内存,Fork子进程的时候需要额外的2GB,容易造成内存不够,当bgsave快照操作出错时,比如磁盘满了,停止写数据到磁盘,Redis也会拒绝新的写入。因此使用bgsave需要保证服务器空闲内存足够(可以通过top -p pid动态监控内存使用情况)

rdbcompression yes

指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大

dbfilename dump.rdb

dbfilename 配置项决定了生成的 RDB 文件名称,默认配置为 dump.rdb

rdbchecksum yes

rdbchecksum 配置 redis 是否使用 CRC64 校验算法校验 RDB 文件是否发生损坏,默认开启状态,如果你需要提升性能,可以选择性关闭

slave-serve-stale-data yes

当从库同主机失去连接或者复制正在进行,yes(默认设置),从库会继续响应客户端的请求

no,除去INFO和SLAVOF命令之外的任何请求都会返回一个错误”SYNC with master in progress”

slave-read-only yes

保证从节点只有读的操作

repl-disable-tcp-nodelay no

设置成yes,则redis会合并小的TCP包从而节省带宽,但会增加同步延迟(最长40ms),造成master与slave数据不一致,适合垮机房部署的情况

设置成no,则redis master会立即发送同步数据,数据的延迟将将减少,但将使用更多带宽进行复制,适合主从网络环境良好的场景

slave-priority 100

slave端的优先级设置,值是一个整数,数字越小表示优先级越高

默认情况下,优先级为100。当master故障时将会按照优先级来选择slave端进行恢复,如果值设置为0,则表示该slave将标记为永远不被选则

appendonly no

yes开启AOF,no关闭AOF 默认 no

appendfilename "appendonly.aof"

生成的 aof文件名称

appendfsync everysec

  三种不同模式:always、everysec和no

 设置为always时,会极大消弱Redis的性能,因为这种模式下每次write后都会调用fsync

如果设置为no,则write后不会有fsync调用,由操作系统自动调度刷磁盘,性能是最好的

everysec为最多每秒调用一次fsync,这种模式性能并不是很糟糕,一般也不会产生毛刺,这归功于Redis引入了BIO线程,所有fsync操作都异步交给了BIO线程(Redis 4.0.0版本后)

no-appendfsync-on-rewrite no

当AOF fsync策略设置为always或everysec时,主进程中调用fsync()同时bgrewriteaof也在操作,两者都会操作磁盘,而bgrewriteaof往往会涉及大量磁盘操作,这样就会造成主进程在写aof文件的时候出现阻塞的情形。

如果该参数设置为no,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题。如果设置为yes,这就相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区,因此这样并不会造成阻塞(因为没有竞争磁盘),但是如果这个时候redis挂掉,就会丢失数据。在linux的操作系统的默认设置下,最多会丢失30s的数据

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

自动重写隐式调用的日志文件规则

指定 Redis 重写 AOF 文件的条件,默认为 100,它会对比上次生成的 AOF 文件大小。如果当前 AOF 文件的增长量大于上次 AOF 文件的 100%,就会触发重写操作;如果将该选项设置为 0,则不会触发重写操作

lua-time-limit 5000

Lua脚本最大执行时间,默认5秒


http://chatgpt.dhexx.cn/article/n2yJeHSI.shtml

相关文章

Redis之过期策略

一、设置过期时间 Redis对存储值的过期处理实际上是针对该值的键(key)处理的,即时间的设置也是设置key的有效时间。Expires字典保存了所有键的过期时间,Expires也被称为过期字段。 expire key time(以秒为单位)--这是最常用的方式…

redis的过期策略【转】

转:Redis的过期策略以及内存淘汰机制_Felix-CSDN博客_redis过期策略和内存淘汰机制 我们知道,redis中缓存的数据是有过期时间的,当缓存数据失效时,redis会删除过期数据以节省内存,那redis是怎样删除过期数据的&#xf…

主成分分析;主成分回归分析——Hald水泥问题;主成分分析案例——各地区普通高等教育发展水平综合评价;matlab

目的 对原变量加以“改造”,在不致损失原变量太多信息的条件下尽可能地降低变量地维数,即用较少的“新变量”代替原来地各变量。通过变换:用低维(主成分)近似高维(较全面)信息。 思想 若有二维…

hadoopHA

一、HA介绍 HA(High Available), 高可用,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,分为活动节点(Active)及备用节点(Standby)。 hadoop2.x之后Clouera提出了QJM/Qurom Jou…

AIDL 和 HIDL

AIDL概述 aidl是常用的android IPC方式,本文将根据一个demo来解析下AIDL的原理。 为了便于读者理解,本文不会探究Binder的实现细节,可以认为Binder在此文的分析中被看做是一个“黑盒”。 有一定经验的读者可以直接到文末看总结,最…

Linux守护进程HALD

hal(hardware abstract lever)硬件抽象。 但是Linux的hal运行于用户空间作为一个daemon进程。监听一个socket接口。等待udev发来的通知。 udev为设备加载驱动,设备可用后,往往有udev的规则,让udev通知hald表示设备变动…

.har文件使用

背景 在做web开发的过程中, 查看http请求/响应是非常常见的操作. 有时可能有这样的需求: 将某次操作的请求/响应保存下来, 给别人看或者分析, 那你可能需要har文件. 另外你还需要Fiddler来查看har文件内容 操作截图 在"Network"面板中, 将某次操作的请求保存为har…

head 命令

转载:每天一个linux命令(14):head 命令_weixin_33794672的博客-CSDN博客head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中&#x…

颜色查找表LUT

查找表(LUT,LookUp Table)是图像颜色转换的强大工具,在许多图形和视频编辑器中使用。 2D LUT CLUT-from-images 2D LUT生成 def generate_identify_color_matrix(width, height, channel):img np.zeros((width, height, chan…

Hadoop HA介绍

1、HA 概述 所谓HA(High Available),即高可用(7*24小时不中断服务)。实现高可用最关键的策略是消除单点故障。Hadoop-HA严格来说应该分成各个组件的HA机制: HDFS的HA和YARN的HA。Hadoop2.0之前&#xff0c…

HAL 库

HAL库 1、初识HAL库 1.1 CMSIS 简介 CMSIS(微控制器软件接口标准):Crotex Microcontroller Software Interface Standard,是由ARM和与其合作的芯片厂商、软件工具厂商,共同制定的标准 ARM官方提供的CMSIS规范架构 …

HIDL(HAL interface definition langguage)

HIDL的相关介绍 HIDL的全称是HAL interface definition language(硬件抽象层接口定义语言),在此之前 Android 有AIDL,架构在Android binder 之上,用来定义Android 基于Binder通信的Client 与Service之间的接口。HIDL…

内部类

一、非静态内部类。 1、修饰符 非静态内部类有四个作用域,所以有四个修饰符。 private : 只能在外部类的内部使用。 protected : 可被与外部类处于同一个包中的其他类和外部类的子类所访问。 省略 : 只能被与外部类处于同一个包中的其他类访问。 public : 可…

python的类作用_python中类的作用是什么

简单来说,类是一种高级抽象,就是一种高级的数据类型,是对象的蓝图,就是用来定义你要用的对象的属性和行为的。 以下是面向对象简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性…

C# 内部类的作用

作用一:限制对类的可访问性 有时候会遇到这样的需求,希望一个类仅能被另一个类(以及其派生类)访问。 代码 class BaseClass {public class PublicNestedClass { }protected class ProtectedNestedClass { }private class Priva…

内部类详解

1.成员内部类 1.样例 class OutClass {class InnerClass {public String SayHi() {return "你好";}} }2.特点 内部类能够无条件的访问外部类的成员变量,外部类要访问内部类成员变量需要使用new。内部类和外部类有相同名称的变量或者是方法,…

Java 静态内部类作用

需要了解2个概念:内部类和静态修饰符static 1)首先,用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。所以没有必要专门用一个Java文件存放这个类。 2)静态都是用来修饰类的内部成员的。…

java内部类的四大作用

一、内部类的作用 我们为什么需要内部类?或者说内部类为啥要存在?其主要原因有如下几点: 内部类方法可以访问该类定义所在作用域中的数据,包括被 private 修饰的私有数据内部类可以对同一包中的其他类隐藏起来内部类可以解决java …

Flink--- 批处理 / 流处理

目录 Flink的主要特点 Flink 和 Spark Streaming 搭建maven工程 FlinkTutorial 添加Scala框架 和 Scala文件夹 Flink-批处理wordcount Flink---流处理wordcount Flink 是一个框架和分布式的处理引擎,用于对无界和有界数据流进行状态计算。 传统数据处理架构 事…

流数据处理利器

流处理 (Stream processing) 是一种计算机编程范式,其允许给定一个数据序列 (流处理数据源),一系列数据操作 (函数) 被应用到流中的每个元素。同时流处理工具可以显著提高程序员的开发效率,允许他们编写有效、干净和简洁的代码。 流数据处理在…