众所周知,redis是一个内存数据库,所有的键值对都是存储在内存中。当数据变多之后,由于内存有
限就要淘汰一些键值对,使得内存有足够的空间来保存新的键值对。在redis中,通过设置server.maxmemory
来限定内存的使用(server.maxmemory为0,不限制内存),到达server.maxmemory就会触发淘汰机制。redis
主要提供6种淘汰策略:
1)volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
2)volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最不常使用的数据淘汰
3)volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
4)volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
4)allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
5)allkeys-lfu:从数据集(server.db[i].dict)中挑选最不常使用的数据淘汰
6)allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
7)no-enviction(驱逐):禁止驱逐数据
redis在每次执行客户端的命令的时候都会检查使用内存是否超过server.maxmemory,如果超过就进行淘汰数据。
int processCommand(client *c) {
……//server.maxmemory为0,表示对内存没有限制
if (server.maxmemory) {
//判断内存,进行内存淘汰
int retval = freeMemoryIfNeeded();
……
}
……
}
int freeMemoryIfNeeded(void) {
mem_reported = zmalloc_used_memory();//获取redis内存使用
if (mem_reported <= server.maxmemory) return C_OK;
mem_used = mem_reported;
if (slaves) {
listRewind(server.slaves,&li);
while((ln = listNext(&li))) {