Redis需要多少内存预留-内存占用多少才安全

上一篇文章,我已经尝试过,用设置的方式,去限制redis内存的占用大小,结果发现是不可行的。(redis不会区分冷热数据,保留冷数据在硬盘上)。那么如果要正常运行redis,就需要知道,redis最多可以占用多少内存,保留多少内存。

结论:

极限情况:留出一倍内存。比如你的redis数据占用了8G内存,那么你还需要再预留8G空闲内存。也就是内存需求是16G。内存占用率低于50%是最安全的。

普通情况正常情况下,在序列化周期内,不会更改所有数据,只会有部分数据更改,那么,预留出可能产生的更改部分的空间,就行。如果实在要说一个数据的话,内存占用率低于75%都是安全的。

比如我们这个游戏服务器的,N台数据服务器之一的截图:


如上图,16G的内存,已经使用了64%了。但是实际上,在fork序列化的时候,只多占用了200多M的内存而已。因为只变动了200多M。 也就是说,使用内存使用率即便达到80%,也是安全的。因为Copy-On-Write就需要200M而已。


以下是扩展阅读,原文链接: https://searchdatabase.techtarget.com.cn/7-21572/

多留一倍内存是最安全的。
重写AOF文件和RDB文件的进程(即使不做持久化,复制到Slave的时候也要写RDB)会fork出一条新进程来, 采用了操作系统的Copy-On-Write策略(如果父进程的内存没被修改,子进程与父进程共享Page。如果父进程的Page被修改, 会复制一份改动前的内容给新进程),留意Console打出来的报告,如”RDB: 1215 MB of memory used by copy-on-write”。
在系统极度繁忙时,如果父进程的所有Page在子进程写RDB过程中都被修改过了,就需要两倍内存。
按照Redis启动时的提醒,设置 vm.overcommit_memory = 1 ,使得fork()一条10G的进程时,因为COW策略而不一定需要有10G的free memory.
当最大内存到达时,按照配置的Policy进行处理, 默认policy为volatile-lru, 对设置了expire time的key进行LRU清除(不是按实际expire time)。如果沒有数据设置了expire time或者policy为noeviction,则直接报错,但此时系统仍支持get之类的读操作。 另外还有几种policy,比如volatile-ttl按最接近expire time的,allkeys-lru对所有key都做LRU。
原来2.0版的VM(将Value放到磁盘,Key仍然放在内存),2.4版后又不支持了。(ps. 这是个坑。我以前记得有这么个东西)




<think>嗯,用户之前问过如何在Windows上卸载Redis,现在又问Redis的最大内存一般设置多少。看来他们可能是在部署或优化Redis时遇到了问题,或者正在规划他们的系统配置。需要先确定用户的使用场景,比如是开发环境还是生产环境,以及他们的数据量访问模式。 首先,Redis的最大内存设置很重要,因为它影响到性能稳定性。如果设置不当,可能会导致内存不足,触发淘汰策略或者被系统OOM killer终止。用户可能想知道如何合理配置,避免这些问题。 需要解释最大内存的设置原则,比如物理内存的百分比,预留空间,系统其他进程的需求。还要提到具体的配置参数maxmemory,以及淘汰策略maxmemory-policy。用户可能对不同的淘汰策略不太清楚,需要简要说明每种策略的适用场景。 另外,用户可能没有考虑持久化的问题,比如RDBAOF对内存的影响,或者复制缓冲区的大小。这些因素在设置最大内存时也需要考虑进去,避免内存被耗尽。 还要举一些例子,比如不同场景下的建议值,比如缓存、持久化数据库、32GB物理内存的服务器如何配置。这些具体例子可以帮助用户更好地理解如何应用这些原则。 用户可能还想知道如何动态调整maxmemory,或者如何监控内存使用情况,确保配置有效。这部分虽然问题中没有提到,但可以作为补充信息帮助用户进一步优化。 最后,要确保回答清晰,步骤明确,避免使用过于专业的术语,让不同技术水平的用户都能理解。同时提醒用户根据实际情况调整,因为每个应用的需求不同。</think>在Redis中设置最大内存(`maxmemory`)需根据实际场景硬件资源权衡,以下是关键原则常见配置建议: --- ### **一、基本原则** 1. **不超过物理内存的70%-80%** - 若服务器总内存为`32GB`,建议设置 `maxmemory 24GB-26GB`。 - 预留内存给操作系统、其他进程及Redis持久化(RDB/AOF)操作。 2. **根据用途调整** - **纯缓存场景**:可设为物理内存的80%-90%,依赖淘汰策略(如`allkeys-lru`)自动清理旧数据。 - **持久化数据库**:需更保守(如60%-70%),避免内存不足导致持久化失败或OOM(Out-Of-Memory)。 3. **系统保留内存** - Linux系统需预留内存防止被OOM Killer强制终止进程(建议至少`1-2GB`)。 --- ### **二、配置参数** 1. **修改`redis.conf`文件** ```bash maxmemory 24gb # 设置最大内存 maxmemory-policy allkeys-lru # 指定淘汰策略(根据场景选择) ``` 2. **运行时动态调整** ```bash redis-cli config set maxmemory 20gb ``` --- ### **三、淘汰策略选择(`maxmemory-policy`)** | 策略 | 适用场景 | 特点 | |------|----------|------| | `volatile-lru` | 缓存 | 仅淘汰**有过期时间**的键,按LRU算法 | | `allkeys-lru` | 通用缓存 | 淘汰**所有键**,适合无明确过期时间的场景 | | `volatile-ttl` | 短期缓存 | 优先淘汰剩余生存时间(TTL)短的键 | | `noeviction` | 持久化数据库 | **不淘汰数据**,内存满时拒绝写入(需谨慎) | --- ### **四、注意事项** 1. **监控内存使用** - 通过`INFO memory`命令查看内存详情,关注`used_memory``maxmemory`比例。 - 使用`redis-cli --bigkeys`分析大Key对内存的影响。 2. **持久化与复制开销** - RDB快照AOF重写会临时占用额外内存(约与数据集大小相同)。 - 主从复制时,主节点的复制缓冲区(`client-output-buffer-limit`)需预留内存。 3. **系统Swap禁用** - Redis依赖内存速度,若启用Swap会严重降低性能。确保系统配置中禁用Swap: ```bash sudo swapoff -a ``` --- ### **五、示例场景** | 场景 | 物理内存 | 建议`maxmemory` | 淘汰策略 | |------|----------|-----------------|----------| | 缓存服务器(高频读取) | 16GB | 12GB-14GB | `allkeys-lru` | | 持久化数据库(低频更新) | 64GB | 40GB-45GB | `volatile-lru` + `noeviction`备用 | | 混合型(缓存+持久化) | 32GB | 20GB-24GB | `allkeys-lfu` | --- ### **总结** - **通用建议**:从物理内存的70%开始,根据监控逐步调整。 - **关键点**:结合淘汰策略、持久化需求、系统预留内存综合评估。 - **最终目标**:避免内存溢出,同时最大化利用资源。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值