首页 > 数据库 >Redis内存淘汰策略

Redis内存淘汰策略

时间:2023-02-12 14:23:15浏览次数:118  
标签:Redis lfu 访问 内存 key TTL 淘汰

内存淘汰:就是当redis内存达到设置的阈值时,主动挑选部分key删除以释放内存

可以分为两个问题:

1,redis什么时候去检查内存够还是不够?

2,怎么来决定删除哪些key?(淘汰策略)

 

1,如果配置了内存上限,redis在任何命令执行之前都会进行内存的检查,如果内存不够的话执行淘汰策略

int processCommand(client *C) {
    //如果服务器设置了server . maxmemory属性,并且并未有执行lua脚本
    if (server .maxmemory && ! server . Aua_ timedout) {
        //尝试进行内存淘汰per formEvictions
        int out_of_memory = (performEvictions() == EVICT_ FAIL) ;
            if (out_ of_ memory && reject_ cmd_on_ oom) {
                rejectCommand(C,shared. oomerr) ;
                return C_ _OK;
    }
    // ....
  }
}                

2,redis的八种内存淘汰策略

noeviction:不淘汰任何key, 但是内存满时不允许写入新数据,默认就是这种策略。

◆volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰
◆allkeys-random:对全体key,随机进行淘汰。也就是直接从db->dict中随机挑选
◆volatile-random: 对设置了TTL的key,随机进行淘汰。也就是从db->expires中随机挑选。
◆allkeys-lru:对全体key, 基于LRU算法进行淘汰
◆volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰
◆allkeys-lfu: 对全体key, 基于LFU算法进行淘汰
◆volatile-lfu: 对设置了TTL的key,基于LFI算法进行淘汰
比较容易混淆的有两个:

LRU (Least Recent Use) : 最少最近使用,用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

LFU (Least Frequent Use) :最少频率使用,会统计key的访问呢频率,值越小淘汰优先级越高。

 

Redis的数据都会被封装为RedisObject结构,根据所配置的淘汰策略,按需记录不同的值。

LFU的访问次数之所以叫逻辑访问次数,是因为并不是每次key被访问都计数,因为记录次数的只有八位,最多只能记录255次,所以是记录运算出的逻辑访问次数:

(1)生成0-1之间的一个随机数R

(2)计算1/ (旧次数*lfu_log_factor +1),记录为p,lfu_log_factor默认为10

(3)如果R<P,则计数+1,且最大不超过255

(4)访问次数会随时间衰减,记录上一次访问时间间隔lfu_decay_time分钟(默认1),计数器-1

 

 

标签:Redis,lfu,访问,内存,key,TTL,淘汰
From: https://www.cnblogs.com/tyleaf/p/17113468.html

相关文章

  • C语言学习:几个常见的内存操作函数
     #include<io_utils.h>#include<string.h>#include<stdlib.h>intmain(){//memchr()//strchr()//memcmp()//strcmp()//memset()char*mem......
  • redis_python_连接
    /Users/song/Code/redis_learn/le00.py#!/usr/bin/envpython3#-*-coding:utf-8-*-importsysimportasynciofromredisimportRedis,AuthenticationError,Time......
  • 前端开发常见应用场景,如何判断是否存在内存泄漏?
    前端项目查看是否有内存泄漏的情况在项目运行中,有时会遇到这样的问题,项目运行时间长了,速度就越来越慢,最后导致页面崩溃。这个时候就需要查看是否有内存泄漏的情况了。怎......
  • springboot 配置redis集群 JedisCluster 3主3从 哈希槽模式
    packagecom.estate.util;importredis.clients.jedis.*;importjava.util.HashSet;importjava.util.Set;publicclassRedisClient{privatestaticJedis......
  • 5.docker安装redis
    下载redis镜像 不讲那么细了,可以参考docker安装mysql的介绍 dockerpullredis 不加冒号和版本表示下载最新版本的 镜像下载完后可以数据 dockerimages 命令查......
  • redis实现分布式锁(包含代码以及分析利弊)
    redis实现分布式锁(基础版)使用redis实现分布式锁的方法有多种,基础版本是基于setnx命令,即如果不存在则设置。这个命令可以保证只有一个客户端能够成功设置一个key,从而获得锁......
  • 变量及内存分配
    参考资料:1.狄泰软件学院的C语言教程2.《armlink_user_guide》、《ARM®DeveloperSuiteCompilersandLibrariesGuide》、《ARM®DeveloperSuiteLinkerandUtilit......
  • 5.4节约内存的编程方法
       以图形用户界面(GUI,GraphicalUserInterface)为基础的Wi你都我是,可以说是一个巨大的操作系统。(1)通过DLL文件实现函数共有     DLL(Dynamic LinkLi......
  • Redis key命名规范
    Rediskey命名规范一、实现目标简洁,高效,可维护二、键值设计规约1Rediskey命名风格【推荐】Rediskey命名需具有可读性以及可管理性,不该使用含义不清的key以......
  • 使用yield大量减少服务器内存占用
    先说几个今天认识的php内置方法查看内存memory_get_usage()返回当前分配给你的PHP脚本的内存量,单位是字节(byte),用来查看方法使用了多少内存。读取文件 f......