内存管理

内存管理

动态调整内存上限

Redis-1>config set maxmemory 2GB
Redis-2>config set maxmemory 6GB

运维提示:
         1:Redis默认无限使用服务器内存,为防止极端情况系统内存耗尽,建议所有的Redis进程都要配置maxmemory。
         2:在保证物理内存足够的情况下,服务器上所有的redis进程可以调整maxmemory参数来达到自由伸缩最大可用内存的目的。

内存回收策略

删除过期键对象

内存溢出控制策略

def freeMemoryIfNeeded() :
    int mem_used, mem_tofree, mem_freed;
    // 计算当前内存总量,排除从节点输出缓冲区和AOF缓冲区的内存占用
    int slaves = server.slaves;
    mem_used = used_memory()-slave_output_buffer_size(slaves)-aof_rewrite_buffer_size();
    // 如果当前使用小于等于maxmemory退出
    if (mem_used <= server.maxmemory) :
        return REDIS_OK;
    // 如果设置内存溢出策略为noeviction(不淘汰),返回错误。
    if (server.maxmemory_policy == 'noeviction') :
        return REDIS_ERR;
    // 计算需要释放多少内存
    mem_tofree = mem_used - server.maxmemory;
    // 初始化已释放内存量
    mem_freed = 0;
    // 根据maxmemory-policy策略循环删除键释放内存
    while (mem_freed < mem_tofree) :
        // 迭代Redis所有数据库空间
        for (int j = 0; j < server.dbnum; j++) :
            String bestkey = null;
            dict dict;
            if (server.maxmemory_policy == 'allkeys-lru' ||
                server.maxmemory_policy == 'allkeys-random'):
                //如果策略是 allkeys-lru/allkeys-random 回收内存目标为所有的数据库键
                dict = server.db[j].dict;
            else :
                // 如果策略是volatile-lru/volatile-random/volatile-ttl回收内存目标为带过期时间的数据库键
                dict = server.db[j].expires;
            null

内存管理