redis evict.c内存淘汰机制的源码分析

           众所周知,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))) {
         
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值