专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Redis学习笔记(2)- Redis key过期策略、内存淘汰机制和持久化

参看网址:

https://tech.souyunku.com6844903709994909710#heading-5
https://tech.souyunku.com6844903709994909710#heading-11
https://www.jianshu.com/p/ad8f35c2c0d0
https://tech.souyunku.com6844903655527677960

1. Redis key过期策略

1.1 Redis过期时间相关命令

在Redis中,可以设置key的过期时间,相关命令如下:

命令 含义 粒度级别
expire 设置key多少秒后过期
pexpire 设置key多少毫秒后过期 毫秒
EXPIREAT 设置key在什么时刻过期 秒级时间戳
PEXPIREAT 设置key在什么时刻过期 毫秒级时间戳
ttl 剩余存活时间
pttl 剩余存活毫秒数 毫秒
persist 持久,不再过期

1.2 3种过期策略

在对key设置了过期时间后,key到期会自动过期,但何时进行过期key的删除动作比较合适呢?

(1)立即删除

在到过期时间后,立即进行删除。
特点:对内存友好,对CPU不友好;

(2)惰性删除

在查询时判断是否过期,过期则删除。
特点:对CPU友好,对内存不友好

(3)定期删除

每隔一段时间去删除过期key。

1.3 Redis过期策略

Redis采用定期删除+惰性删除结合的策略

2. Redis内存淘汰机制

Redis内存淘汰是用来淘汰包含非持久的、持久的key,当redis使用的内存大小达到设置的最大内存时,redis会根据内存淘汰机制来删除一些key。

最大内存设置

maxmemory。为0表示不限制

淘汰策略:

策略 算法 key类型
volatile-lru 淘汰最近最久未使用(时间)的非持久key 非持久key
volatile-lfu 淘汰最近最不常用(频次)的非持久key 非持久key
valatile-random 随机淘汰非持久key 非持久key
valatile-ttl 淘汰剩余过期时间最小非持久key 非持久key
allkeys-lru 淘汰最近最久未使用的key 所有key
allkeys-lfu 淘汰最近最不常用的key 所有key
allkeys-random 随机淘汰key 所有key
noeviction 禁止淘汰数据,内存满写操作会报错 所有key

默认策略和配置项:

noeviction。
配置项:maxmemory-policy

redis作缓存建议淘汰策略:

如果redis当做缓存来使用,为了保证缓存中数据是热点数据,可以使用allkeys-lru,或者allkeys-lfu来淘汰数据。

3. Redis持久化

Redis支持将内存中数据持久化,用于崩溃后恢复数据。
Redis支持两种持久化方式:RDB快照持久化和AOF增量持久化。

3.1 RDB快照持久化

概念

RDB快照持久化是对redis某一时刻所有数据进行全量持久化(生成数据库当前时刻的快照),生成的rdb文件是一个经过压缩的二进制文件,redis在启动时可以通过读取rdb文件来还原数据。

89_1.png

启动时读取RDB文件

89_2.png

持久化方式

RDB持久化主要有两种方式:手动自动,以及server关闭时自动持久化动作。

(1)手动

可以通过save或bgsave来手动处RDB持久化,其中save是阻塞的bgsave会建立一个子线程来创建RDB文件

  • 需要注意的是redis server启动时读取rdb文件也是阻塞的。
(2)自动

根据配置文件,redis会在满足条件时,自动触发rdb持久化(自动触发使用的是bgsave)。RDB持久化默认配置如下:

dbfilename dump.rdb   #rdb文件名
save 900 1            #在900秒(15分钟)之后,至少有1个key发生变化,
save 300 10           #在300秒(5分钟)之后,至少有10个key发生变化
save 60 10000         #在60秒(1分钟)之后,至少有10000个key发生变化

(3)关闭时自动持久化

使用redis-cli执行shutdown或者shutdown save时,会先进行持久化再关闭server。
直接kill进程或者shutdown nosave不会执行持久化动作,导致一部分数据丢失。

89_3.png

3.2 AOF文件追加增量持久化

概念

AOF持久化是通过将服务器执行的写命令追加到文件中,启动时通过读取AOF文件,重新执行写命令来恢复数据。

89_4.png

持久化配置

开启AOF持久化:

# 是否开启AOF,默认关闭(no)
appendonly yes

AOF文件路径:

appendfilename "appendonly.aof"

持久化频率

AOF支持上种模式的写磁盘模式,分别是always、everysec、no,解释如下:

# appendfsync always  每次收到写命令就立即强制写入磁盘。最有保证的方式,但是对redis性能影响非常大
appendfsync everysec  # 每秒钟强制写入磁盘一次,在性能和持久化安全性方面做了很好的折中,是推荐的方式。
# appendfsync no      完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证

AOF重写

AOF还可以对多条写命令进行重写,合并成单调命令,从而减小AOF文件的体积。

3.3 RDB和AOF

(1)同时开启RDB和AOF

Redis支持同时开启RDB和AOF,但是实际上当AOF开启并且aof文件存在时,优先从aof文件中恢复数据。当AOF关闭或者aof文件不存在时,使用RDB文件进行数据恢复。

(2)优缺点

RDB

优点:文件体积小,恢复快;
缺点:容易丢失数据,因为需要一定条件才会触发RDB文件生成;(默认配置最快60秒才新生成RDB文件)

AOF

优点:丢失数据较少,按照默认配置的话,每秒写一次文件,只会丢失1秒的数据。 缺点:文件提交大,恢复数据相对较慢。

aof文件和rdb文件大小比较示意图

89_5.png

(3)两者对过期键的处理

参考网址:

https://tech.souyunku.com/lukexwang/p/4710333.html

RDB
  • 已过期的key不会被保存到rdb文件中;
  • 从rdb文件恢复数据时,过期的key会被忽略(主服务器会忽略,从服务器不会忽略);
AOF
  • 在key被惰性删除,或定期删除时会向AOF追加一条DEL命令
  • 读取AOF文件时,过期键会被忽略(主从情况下不太确定?)

文章永久链接:https://tech.souyunku.com/36690

未经允许不得转载:搜云库技术团队 » Redis学习笔记(2)- Redis key过期策略、内存淘汰机制和持久化

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们