内存管理
动态调整内存上限
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