info memory 查看redis 内存使用情况
出现的问题,公司在导入大量redis key 的时候,想要看一下redis 内存使用情况 ,发现used_memory_peak_perc 和 used_memory_dataset_perc 马上达到100%,这个时候很慌张,是不是当前redis 内存打满了,然后查了网上的博客,查到used_memory_dataset_perc:
在Redis中,used_memory_dataset_perc是用来表示“数据占用的内存大小的百分比”。这个指标是“数据空间占用总内存的百分比”,计算方式为“100% * (used_memory_dataset / (used_memory - used_memory_startup))”。
意思是如果这个比例如果达到了100%就会导致内存写满,这个时候非常慌张,但是又有文章说
意思是这个值永远也不会打满,这个时候就存在了一个疑惑,为什么说used_memory_dataset_perc 满了意味着内存使用已满,但是为什么又说是永远打不满,这是否存在矛盾,然后基于这个问题又进行探索。
发现操作系统的内存大小是在376G ,查看了redis 的内存分配机制,如果说redis 没有配置maxmemory 那 redis 会在达到峰值的时候像操作系统申请内存,假设操作系统内存完全提供给redis, 那理念上redis 的内存实际上是操作系统内存数,那上述问题就解决了,意思是当前内存使用量和redis 已经申请的内存的达到一定值的时候,redis 会向操作系统申请内存来应对内存使用满的情况,直到redis 的内存量和操作系统的内存量达到一致。但是情况是操作系统的内存不可能完全提供给redis使用,同时如果redis 的内存完全由操作系统内存决定的话,会非常的不稳定。
通过
free -h
发现当前操作系统只能提供给117G的内存空闲内存,那意味着如果redis 内存使用情况达到操作系统内存可用峰值的时候,redis 内存就会实际上满,那这个时候redis 就会出现以下问题:
1。如果Redis实例的内存资源有限,达到峰值可能意味着无法再继续处理新的数据或请求,可能导致系统性能下降甚至崩溃。
2。如果达到峰值的内存使用量是由于数据写入造成的,那么在数据量大的情况下,可能会引发写入失败或写入延迟等问题。
因此,当used_memory_peak_perc达到100%时,通常被认为是不良情况,需要采取措施来降低内存使用量或者增加Redis实例的内存资源。这可能涉及到优化数据结构、删除部分数据、增加Redis实例的内存大小等措施。
然后导致redis 淘汰机制进行淘汰key ,性能下降崩溃,写入延迟,严重影响服务。
当redis 部署和其他进程部署在同一个机器下的时候,这种方式就非常危险,那怎么解决这个问题呢?
通过设置maxmemory,给redis 一个固定的redis 最大内存上限。
maxmemory :设置 redis 可用内存的上限。
如果 Redis 没有设置 maxmemory 参数,在 64bit 系统下那么它将使用默认值,通常为 0 或无限制。在 32bit 系统下,maxmemory 隐式不能超过 3GB。
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "0"
127.0.0.1:6379> CONFIG SET maxmemory 100MB
OK
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "104857600"
另一种方法是修改配置文件 redis.conf:
maxmemory 100mb
如果可用内存达到上限会发生什么?
redis 将试着根据配置的缓存策略去移除部分数据
当数据删不掉时,客户端在写数据时,服务端会响应错误信息
但是不会影响客户端读取数据
当达到maxmemory 时请设置最合适的淘汰机制去淘汰key,以降低对服务的影响。