`

Redis内存使用达到maxmemory设定值后玩家数据无法写入解决

 
阅读更多

先说说我们公司这边的redis应用场景。目前线上的游戏是采用redis作为MongoDB的前端缓存,存储一些玩家需要经常访问的数据,同时游戏的运营公告信息以及BI相关采集数据也存放在redis中。在上周五,运营同事反映在某个合作方的游戏后台添加了游戏运营公告,但是进入游戏后却无法看到公告更新。同时,也有玩家反映游戏相关的活动奖励,游戏排行榜等信息没有更新。通过和开发同事沟通,初步判断是redis无法写入的问题。由于合作方之前一直没有提供redis服务器的访问权限,只有redis实例的权限。通过查看之前让合作方运维同事提供的redis配置参数,发现他们设置了maxmemory 2G 限定了单个redis实例最大使用内存为2G。我勒个去,这个坑可大了,由于之前对redis运维方面没有作深入研究,也没有仔细核对对方运维的redis配置参数。结果这次就坑大了。我们有接近10个区的数据都写入了这个实例中。再进入redis实例中,使用info 命令查看used_memory_human:1.98G 差不多达到了最大值,难怪更新了后台公告,游戏内却无法显示。然后联系对方运维调整maxmemory参数,一切恢复正常,运营那边又得制定玩家赔偿方案了。

redis的相关配置参考信息直接可以通过redis.conf文件查看,在这个文件中关于redis的常规配置已经解释得比较清楚了。这里主要讲解一下maxmemory相关的说明。

如果设定了maxmemory,使用redis的时候,redis的内存使用量不能超过设定的值,一旦redis的内存使用量达到了最大值,redis将会尝试按照选择的eviction policy(回收策略)移除相应的keys

如果redis不能根据回收策略移除keys,或者回收策略设置成noeviction,那么redis将对需要写操作的命令返回错误信息,如SET,LPUSH操作,对GET这样的只读操作会继续响应。

在redis.conf中给出了一个警告信息,如果一个设置了maxmemory的实例连接了从redis,那么预留给redis使用的内存除了redis实例本身占用的内存外还要加上用于主从复制的输出缓冲区大小(the output buffers need to feed the slaves),这样,才不会触发移除keys的死循环,因为当内存达到最大内存限制后,会根据eviction policy移除相应的keys,这时,从redis也会同步移除keys操作,最终所有数据都被清空。

总之,一句话,对一个连接了从redis的redis实例设置maxmemory时,建议设置一个较高的值,使系统有多余的内存用于主从同步,当然,如果eviction policy设置成noevcition,则不需要这么设置。

分享到:
评论

相关推荐

    redis基础使用说明文档

    - Redis使用LRU(最近最少使用)策略进行内存淘汰,可通过`maxmemory`设置最大内存限制。 - 使用`INFO`命令监控Redis的状态,包括内存、CPU、连接数等,以便进行性能优化。 8. **安全与监控** - Redis默认不开启...

    redis配置的文档

    15. **最大内存使用 (maxmemory)**: `maxmemory <bytes>` 设置 Redis 可用的最大内存,超过这个值将触发 LRU (Least Recently Used) 或 LFU (Least Frequently Used) 策略来淘汰旧数据。 16. **AOF 模式 (APPEND ...

    redis监控模板-配置-脚本.zip

    你可以通过修改`bind`参数来控制Redis监听哪个网络接口,`port`来设定服务端口,`dbfilename`和`dir`指定RDB持久化文件的位置,`maxmemory`定义最大内存限制,`save`配置点火触发RDB快照的条件,以及`appendonly`和`...

    redis 配置说明文件

    虽然Redis早期版本支持虚拟内存机制,但在后续版本中已被移除,现在推荐使用AOF或RDB持久化结合内存管理策略来应对大数据量场景。 以上是Redis配置文件的关键参数,正确配置这些参数能确保Redis服务的稳定性和性能...

    redis的缓存失效策略和主键失效机制【java面试常问】.docx

    当内存达到设定值后,Redis将启动数据淘汰策略来释放内存空间。 ##### 1. Redis的六种数据淘汰策略 - **volatile-lru**:从已设置过期时间的数据集中淘汰最近最少使用的数据。 - **volatile-ttl**:从已设置过期...

    redis技术文档

    - `maxmemory`: 设置Redis最大内存限制。 - `appendonly`: 开启AOF持久化模式。 - `save`: 配置RDB持久化策略。 - `databases`: 设置数据库的数量。 ##### 4.3 启动redis服务 - 在Linux环境下,可以通过命令`redis...

    Redis笔记整合1

    为了保证数据的最终删除,Redis提供了内存淘汰机制,通过`maxmemory-policy`配置来设定策略。共有六种策略: 1. `volatile-lru`:优先淘汰最近最少使用的带有过期时间的键。 2. `volatile-ttl`:优先淘汰即将过期的...

    Redis配置参数详解

    - **配置说明**:通过`maxmemory`参数可以设定Redis使用的最大内存。当达到该限制时,Redis会尝试清理过期的键,以释放空间。此外,Redis还提供了VM机制,可以将部分数据存放到磁盘上,以降低内存占用。 #### 18. ...

    Redis的配置简介

    `maxmemory`限制了Redis的内存使用量,超出时可以通过配置`maxmemory-policy`来决定如何处理新数据。常见的策略包括`volatile-lru`、`allkeys-lru`等。 **其他配置** 还有许多其他配置,如`appendonly`用于开启AOF...

    redis的配置文件,解压后放到conf文件夹下

    以上是`redis.conf`中主要的配置选项,实际使用中需要根据服务器的硬件资源、应用需求以及安全性来调整这些参数,以达到最优的性能和可靠性。在解压后的`redis.conf`文件放入`conf`文件夹下后,可以通过启动Redis...

    redis配置文件参数说明.docx

    17. **maxmemory**: Redis 的最大内存限制,超过后 Redis 尝试清理过期 Key 或使用虚拟内存机制。 18. **appendonly**: 是否开启 AOF(Append Only File)日志,用于保证数据安全性,默认关闭。 19. **...

    第 4 章: Redis 服务器的配置与管理.rar

    例如,通过调整`maxmemory`,我们可以控制Redis在内存中的数据量,避免内存溢出;`bind`参数用于指定服务器监听哪些网络接口;`appendonly`和`appendfsync`则关乎到AOF持久化机制的启用和同步策略。 接下来是**RDB...

    redis主从集群搭建及容灾部署(哨兵sentinel)实用.pdf

    - 为了提升性能,可以考虑使用Redis Cluster实现数据分区,分散负载。 - 定期备份数据,以防万一。 - 监控哨兵系统的状态,确保其正常运行。 总之,构建Redis主从集群和哨兵系统是实现高可用性的重要步骤。通过...

    如何高效使用Redis作为LRU缓存

    在使用Redis作为LRU缓存之前,首先要设定`maxmemory`配置,以限制Redis实例所能使用的内存总量。这可以通过修改`redis.conf`文件或在运行时使用`config set`命令完成。例如,要将最大内存限制设置为100MB,可以在...

    Redis面试题精选.docx

    Redis是一种流行的开源内存数据存储系统,常用于缓存、消息队列和数据库等功能。它提供了多种数据类型,包括: 1. **String**:基础数据类型,可以存储任意二进制数据,最大512MB。 2. **Hash**:键值对的集合,...

    redis2.8配置文件中文翻译版

    当达到上限,Redis将使用指定的内存策略进行数据淘汰。 ### 内存淘汰策略 (maxmemory-policy) `maxmemory-policy` 决定在内存不足时如何处理新写入的数据,可选策略包括 `noeviction`(禁止写入)、`volatile-lru`...

Global site tag (gtag.js) - Google Analytics