淘汰机制
在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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。