乐趣区

关于redis:redis-内存满了怎么办

淘汰机制

在 redis.conf 中,能够配置 maxmemory 100mb 来设置 redis 的内存,如果设置为 0,在 64 位零碎中,有多少内存就能够应用多少,在 32 位零碎中,能够应用 3GB 的内存。有些 key 设置过期工夫的,所以 redis 会清理掉使之不占内存空间,有些 key 是没有设置过期工夫的,这些 key 会始终占用内存空间,当内存达到指定的内存大小 maxmemory 时,redis 有以下几种淘汰机制提供抉择:

  • noeviction:当内存满的时候,回绝写入。
  • allkeys-lru:当内存满的时候,移除最近应用较少的(LRU)key。
  • volatile-lru:当内存满的时候,在设置过期的 key 中移除最近应用较少的(LRU)key。
  • allkeys-random:当内存满的时候,随机移除 key。
  • volatile-random:当内存满的时候,在设置过期的 key 中随机移除 key。
  • volatile-ttl:当内存满的时候,在设置过期的 key 中移除快要过期的 key。

allkeys-lru是比拟罕用的机制,依据应用工夫,大概率的保留应用频繁的内存,进步零碎的拜访性能。比方 A 数据,应用很频繁,能够在内存中始终获取数据,而不必从数据库读取数据。如果保留的 B 数据,几天才拜访一次,就占用了内存空间。
allkeys-random在循环拜访的时候,能够用的上,因为所有的 key 拜访的频率是一样的,感觉应用场景不多。
noeviction应用的场景不多,volatile-lruvolatile-randomvolatile-ttl对于设置过期的 key 的场景,也没有很多。
淘汰机制是如何工作的呢?

  1. 客户端发送增加数据的命令。
  2. redis 查看内存空间是否超过 maxmemory 的配置值,如果超过了,应用相应的淘汰机制清理数据。
  3. 执行客户端的命令。

这个流程有可能使理论内存大于 maxmemory 的配置值。比方以后的内存大于等于 maxmemory 的配置值 100mb,redis 清理后还有 99MB,而后执行客户端命令,插入了 1.1MB,这样 redis 中就有了 100.1MB。

退出移动版