淘汰机制
在 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-lru、volatile-random、volatile-ttl对于设置过期的 key 的场景,也没有很多。
淘汰机制是如何工作的呢?
- 客户端发送增加数据的命令。
- redis 查看内存空间是否超过 maxmemory 的配置值,如果超过了,应用相应的淘汰机制清理数据。
- 执行客户端的命令。
这个流程有可能使理论内存大于 maxmemory 的配置值。比方以后的内存大于等于 maxmemory 的配置值 100mb,redis 清理后还有 99MB,而后执行客户端命令,插入了 1.1MB,这样 redis 中就有了 100.1MB。