淘汰机制

在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。


大军
847 声望183 粉丝

学而不思则罔,思而不学则殆