Redis——内存策略

目录

前言

1.过期策略

1.1过期策略------DB结构

1.2过期策略------惰性删除

1.3过期策略------定期删除

2.淘汰策略

2.1最少最近使用和使用频率原理

2.2内存淘汰策略执行流程

总结:


前言

Redis之所以性能强,主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。

我们可以通过修改配置文件来设置Redis的最大内存:

当内存使用达到上限时,就无法存储更多数据了,再 添加数据时就会淘汰其他数据。所有就有内存淘汰策略。

1.过期策略

对于Redis缓存,我们可以通过expire命令给Redis的key设置TTL(存活时间):

可以发现,当key的TTL到期以后,再次访问name返回时nil,说明这个key已经不存在了,对应的内存也得到释放。从而起到内存回收的目的。

1.1过期策略------DB结构

redis本身是一个典型的key-value内存存储数据库,因此所有的key,value都保存在之前学习过的Dict结构中。不过在
其database结构体中,有两个Dict:一个用来记录key-value;另一个用来记录key-TTL。

内存结构图:

所以Redis利用两个Dict分别记录key-value对及key-TTL对

1.2过期策略------惰性删除

是不是TTL到期就立即删除了呢?

如果key很多,都给这些key设置定时器,对于CPU会有非常的压力,这样就会严重影响Redis服务本身的一个性能。

所以实际应用种Redis不是采用立即删除,而是周期删除,惰性删除这两种策略。

**惰性删除:**顾名思义并不是在TTL到期后就立刻删除,而是在访问一个key的时候,检查该key的存活时间,如果已经过期才执行删除。

惰性删除是我去访问它才会被删除,如果很长一段时间都没有被访问,就永远不会被删除,所以就需要周期删除

1.3过期策略------定期删除

**周期删除:**顾明思议是通过一个定时任务,周期性的抽样部分过期的key,然后执行删除。执行周期有两种:

  • Redis会设置一个定时任务servercron(),按照server.hz的频率来执行过期key清理,模式为SLOW
  • Redis的每个事件循环前会调用beforesleep()函数,执行过期key清理,模式为FAST

SLOW模式规则(低频-高时长):

  • 执行频率受server.hz影响,默认为10,即每秒执行10次,每个执行周期100ms.
  • 执行清理耗时不超过一次执行周期的25%.
  • 逐个遍历db,逐个遍历db中的bucket,抽取20个key判断是否过期
  • 如果没达到时间上限(25ms)并且过期key比例大于10%,再进行一次抽样,否则结束

FAST模式规则(过期key比例小于10%不执行):

  • 执行频率受beforesleep()调用频率影响,但两次fast模式间隔不低于2ms
  • 执行清理耗时不超过1ms
  • 逐个遍历db,逐个遍历db中的bucket,抽取20个key判断是否过期
  • 如果 如果没达到时间上限(1ms)并且过期key比例大于10%,再进行一次抽样,否则结束

2.淘汰策略

内存淘汰: 就是当Redis内存使用达到设置的阈值时,Redis主动挑选部分key删除以释放更多内存的流程。

Redis会在处理客户端命令的方法processCommand()中尝试做内存淘汰:

Redis支持8种不同策略来选择要删除的key:

四种算法-八种策略

2.1最少最近使用和使用频率原理

比较容易混淆的有两个:

关于key的最少最近使用和使用频率如何实现?

Redis的数据都会被封装为RedisObject结构:

LFU的访问系数之所以叫逻辑访问次数,是因为并不是每次key都被访问都计数,而是通过运算:

2.2内存淘汰策略执行流程

关于淘汰策略执行流程图:

总结:

为了防止内存的达到上限,redis对内存的管理策略一般分为两类:

1.内存过期策略: 对过期的key的回收策略

  • 惰性删除(单个)
  • 过期删除(批量)

设置一个定时任务,周期性的进行采样抽取,并删除过期的key.

- SLOW模式: 低频 高时长

- FAST模式: 高频 低时长

2.内存淘汰策略: 内存使用达到上限的回收策略

八种策略,四种算法

  • LRU Least Recently Used 回收[最少最近使用 当前时间-上一次使用时间]
  • LFU Least FrequentLy Used 回收[使用频率最少的key 使用频率最少的]
  • 随机
  • TTL
相关推荐
异世界贤狼转生码农2 小时前
MongoDB Windows 系统实战手册:从配置到数据处理入门
数据库·mongodb
QuZhengRong2 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
码农阿豪2 小时前
Windows从零到一安装KingbaseES数据库及使用ksql工具连接全指南
数据库·windows
时序数据说7 小时前
时序数据库市场前景分析
大数据·数据库·物联网·开源·时序数据库
听雪楼主.11 小时前
Oracle Undo Tablespace 使用率暴涨案例分析
数据库·oracle·架构
我科绝伦(Huanhuan Zhou)11 小时前
KINGBASE集群日常维护管理命令总结
数据库·database
妖灵翎幺11 小时前
Java应届生求职八股(2)---Mysql篇
数据库·mysql
HMBBLOVEPDX11 小时前
MySQL的事务日志:
数据库·mysql
weixin_4196583113 小时前
MySQL数据库备份与恢复
数据库·mysql
如白驹过隙14 小时前
cloudflare缓存配置
前端·缓存