Redis 内存管理
2022-08-31 本文已影响0人
右耳菌
1. Redis内存分配
- 不同数据类型的大小限制
- Strings类型: 一个String类型的value最大可以存储512Mo
- Lists类型: list的元素个数最多为2432-1个,也就是4294967295个。
- Sets类型: 元素个数最多为2432-1个,也就是4294967295个。
- Hashes类型: 键值对个数最多为2^32-1个,也就是4294967295个
- 最大内存控制
#最大内存控制
maxmemory 最大内存阈值
maxmemory-policy 到达阈值的执行策略
2. 内存压缩
大小超出压缩范围,溢出后Redis将自动将其转换为正常大小
3. 过期数据的处理策略
主动处理(redis主动触发检测key是否过期)每秒执行10次。过程如下:
- 从具有相关过期的密钥集中测试20个随机密钥
- 删除找到的所有密钥已过期
- 如果超过25%的密钥已过期,请从步骤1重新开始
被动处理:
- 每次访问key的时候,发现超时后被动过期,清理掉
4. 数据恢复阶段过期数据的处理策略
RDB方式
过期的key不会被持久化到文件中。
载入时过期的key,会通过redis的主动和被动方式清理掉。
AOF方式
当redis 使用AOF方式持久化时,每次遇到过期的key redis会追加一条DEL命令到AOF文件,
也就是说只要我们顺序载入执行AOF命令文件就会删除过期的键。
注意: 过期数据的计算和计算机本身的时间是有直接联系的!也就是redis的过期时间判断是根据系统时间来的,回拨时间会导致某些数据不会过期。
5. Redis内存回收策略
配置文件中设置:
maxmemory-policy noeviction
动态调整:
config set maxmemory-policy noeviction
回收策略 | 说明 |
---|---|
noeviction(不驱逐) | 客户端尝试执行会让更多内存被使用的命令直接报错 |
allkeys-lru() | 在所有key里执行LRU算法 |
volatile-Iru | 在所有已经过期的key里执行LRU算法 |
volatile-lfu | 使用过期集在密钥中使用近似LFU进行驱逐 |
allkeys-lfu | 使用近似LFU逐出任何键 |
allkeys-random | 在所有key里随机回收 |
volatile-random | 在已经过期的key里随机回收 |
volatile-ttl | 回收已经过期的key,并且优先回收存活时间(TTL)较短的键 |
6. Redis中的LRU算法
LRU (Least recently used,最近最少使用)︰根据数据的历史访问记录来进行淘汰数据
- 核心思想:
如果数据最近被访问过,那么将来被访问的几率也更高。 - 注意:
Redis的LRU算法并非完整的实现,完整的LRU实现是因为这需要太多的内存。 - 方法:
通过对少量keys进行取样(50%),然后回收其中一个最好的key。 - 配置方式:
maxmemory-samples 5
7. Redis中的LFU算法
LFU (Least Frequently Used)根据数据的历史访问频率来淘汰数据。
- 核心思想:
如果数据过去被访问多次,那么将来被访问的频率也更高。 - Redis实现的是近似的实现,每次对key进行访问时,用基于概率的对数计数器来记录访问次数,同时这个计数器会随着时间推移而减小。
- Morris counter算法依据
- 启用LFU算法后,可以使用热点数据分析功能。( redis-cli --hotkeys )
如果觉得有收获,欢迎点赞和评论,更多知识,请点击关注查看我的主页信息哦~