Redis内存管理

本文详细介绍了Redis的内存存储机制,包括不同数据类型的大小限制、内存压缩配置、过期数据处理策略以及内存回收策略。深入解析了Redis如何通过LRU和LFU算法管理内存,以及在不同场景下如何配置内存策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis存储的区域主要是内存

内存分配:

    不同数据类型的大小限制:

    String类型:一个String类型的value最大可以存512M。

    Lists类型:list的元素个数最多为2^32-1个,也就是4294967295个。

    Sets类型:元素个数最多为2^32-1个,也就是4294967295个。

    Hashes类型:键值对个数最多为2^32-1个,也就是4294967295个。

 

    最大内存控制,在redis.conf配置文件:

maxmemory 最大内存阈值

maxmemory-policy 达到阈值的执行策略

 

内存压缩,Redis的内存压缩配置,大小超出压缩范围,溢出后Redis将自动将其转换为正常大小,不在压缩,为了降低CPU运用。

#配置字段最多512个

hash-max-zipmap-entries 512


#配置value最大为64字节

hash-max-zipmap-value 64


#配置元素个数最多512个

list-max-ziplist-entries 512


#配置value最大为64字节

list-max-ziplist-value 64


#配置元素个数最多512个

set-max-intset-entries 512


#配置元素个数最多128个

zset-max-ziplist-entries 128


#配置value最大为64字节

zset-max-ziplist-value 64

 

过期数据的处理策略:

    主动处理(redis主动触发检测key是否过期)每秒执行10次。过程如下:

  •     从具有相关过期的密钥集中测试20个随机密钥(收集带有设置过期时间的key)

  •     删除找到的所有密钥已过期(删除过期的key)

  •     如果超过25%的密钥已过期,请从步骤1重新开始

 

    被动处理:

  •     每次访问key的时候,发现超时后被动过期,清理掉

 

数据恢复阶段过期数据的处理策略:

    RDB方式:

  •     过期的key不会被持久化到文件中。

  •     载入时过期的key,会通过redis的主动和被动方式清理掉(例:key设置了过期时间5秒,当第3秒Redis服务挂掉了,5秒后重启,重启加载RDB会根据当前系统时间判断是否过期,然后对过期数据进行主动处理策略)

    

    AOF方式:

  •     当redis使用AOF方式持久化时,每次遇到过期的key redis会追加一条DEL 命令到 AOF文件,也就是说只要我们顺序载入执行AOF命令文件就会删除过期的键。

 

    注意:过期数据的计算和计算机本身的时间是有直接联系的!

 

Redis内存回收策略:

    在redis.conf修改配置:

maxmemory-policy noeviction

 

    动态调整,执行命令:

config set maxmemory-policy noeviction

 

回收策略

说明

noeviction

客户端尝试执行会让更多内存被使用的命令直接报错

allkeys-lru

在所有key里执行LRU算法

volatile-lru

在所有已经过期的key里执行LRU算法

volatile-lfu

使用过期集在秘钥中使用近似LFU进行驱逐

allkeys-lfu

使用近似LFU逐出任何键

allkeys-random

在所有key里随机回收

volatile-random

在已经过期的可以里随机回收

volatile-ttl

回收已经过期的key,并且优先回收存活时间(TTL)较短的键

 

lru:当内存不足的时候首先清除最久没有被访问的数据

lfu:当内存不足的时候首先清除概率计算被访问次数最少的数据

 

LRU算法:

    LRU(Least recently used,最近最少使用):根据数据的历史访问记录来进行淘汰数据

  •     核心思想:如果数据最近被访问,那么将来被访问的几率也更高。

  •     注意:Redis的LRU算法并非完整的实现,完整的LRU实现是因为这需要太多的内存。

  •     方法:通过对少量kyes进行抽样(50%),然后回收其中一个最好的key。

  •     配置方式,在redis.conf文件配置:maxmemory-samples 5

 

 

LFU算法:

    LFU(Least Frequently Used)根据数据的历史访问频率来淘汰数据

  •     核心思想:如果数据过去被访问多次,那么将来被访问的频率也更高。

  •     Redis实现的是近似的实现,每次对key进行访问时,用于概率的对数计算器来记录访问的次数,同时这个是计算器会随着时间推移而减小。

  •     Morris counter算法依据:https://en.wikipedia.org/wiki/Approximate_counting_algorithm

  •     启动LFU算法后,可以使用热点数据分析功能。(redis-cli --hotkeys),如查看热点数据是哪些。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值