Redis有哪些内存回收策略,手写代码实现一个LRU?

2019-11-10 23:00:2302:18 1271
所属专辑:Redis面试通关12讲
声音简介

大家好,我系渣渣骥,今天跟大家分享的主题是: Redis有哪些内存回收策略,手写代码实现一个LRU缓存?

Redis支持的内存回收策略如下:

1.volatile-lru:已设置过期的数据集中挑选最近最少使用的淘汰

2.volatile-ttl:已设置过期的数据集中挑选将要过期的数据淘汰

3.volatile-random:已设置过期的数据集中任意挑选数据淘汰

4.allkeys-lru:所有数据集中挑选最近最少使用的数据淘汰

5.allkeys-random:所有数据集中任意挑选数据淘汰

6.noenviction:禁止淘汰数据

 

Redis的配置文件(redis.conf)中有一个maxmemory-policy专门用于配置内存回收策略。默认是noenviction,但是生产环境不建议使用,建议根据业务特点选择使用allkeys-lruvolatile-lru或者volatile-ttl.

 

需要注意的是,为了保证高性能,在LRUTTL算法中,Redis不会对全部的键值进行比较,而是采用了近似的算法。例如,使用maxmemory-policy=volatile-ttl策略,另一个参数maxmemory-samples3,按照探测顺序,有A,B,C,D,E五个KEY即将过期,即将过期时间分别为6s, 3s,2s,1s,9s. 由于maxmemory-samples3, Redis不会将ABCDE都进行比较,而是将前3ABC进行比较,发现C只有2s就要过期为最小,于是淘汰了C。可见,maxmemory-samples越大,淘汰越准确,但是效率也就越低。

 

那么如何实现一个LRU缓存呢?可以参考leetcode 146题:实现一个LRU缓存。这里提供一种思路:直接利用LinkedHashMap, 覆写其removeEldestEntry(Map.Entry eldest) 方法,在超过总长度时删除最不常用的一个元素。参考代码如下:

importjava.util.*;

classLRUCache extends LinkedHashMap<Integer,Integer>{

    private int maxNum;

    public LRUCache(int capacity) {

        super(capacity, 0.75f, true);

        this.maxNum = capacity;

    }

   

    public int get(int key) {

        return super.getOrDefault(key, -1);

    }

   

    public void put(int key, int value) {

        super.put(key, value);

    }

   

    protected boolean removeEldestEntry(Map.Entryeldest) {

        return size() > maxNum;

    }

}

如果不用LinkedHashMap,只需要记录元素的使用次数。每次加入时移除最少使用的那个元素即可。



用户评论

表情0/300
喵,没有找到相关结果~
暂时没有评论,下载喜马拉雅与主播互动
猜你喜欢
无限内存

【内容简介】它能帮助你获得自然系恶魔果实异能,它能令你顷刻间拥有《功夫》中像星爷一样的如来神掌,你可以随意改变电影剧情,不再令那些看不顺眼的“主角”侥幸胜过你喜...

by:火焰山FM

无限内存 无限流小说

它能帮助你获得自然系恶魔果实异能,它能令你顷刻间拥有《功夫》中像星爷一样的如来神掌,你可以随意改变电影剧情,不再令那些看不顺眼的“主角”侥幸胜过你喜欢的反面角色...

by:丶3994

嵌入式培训丨C语言内存操作

C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器,是仅产生少量的机器语言以及不需要任何运行环境支持便...

by:成都星辉科技

电脑硬件基础-主板内存CPU硬盘

移动互联网时代,电脑用户明显呈现两级分化,普通用户更热衷于高性能的智能手机,对电脑似乎没什么热情,一台5000块的电脑可以用5年,一部5000块的手机最多用2年...

by:橙桔电商

艺术|有哪些慰藉

艺术|让人清醒的美学积累||人们常说艺术非常重要,却很少有人告诉我们确切原因。我自己的感受是每次看了美术展、艺术展之后,心情都会很放松或者特别愉快。

by:各色飞船

尿频原因有哪些

尿频原因有哪些希望大家可以订阅我的专辑,并关注我,欢迎评论、转发、收藏、点赞,投月票,希望让更多的人看到,帮助到更多人。

by:孙华贵

肾虚有哪些表现

肾虚有哪些表现肾虚的表现多种多样,常见的有腰膝酸软、头晕耳鸣、失眠多梦、记忆力减退、脱发、早衰、性功能减退等。根据肾虚的不同类型,如肾阳虚、肾阴虚、肾精不足等,...

by:孙华贵

血糖高有哪些表现

糖尿病是现在比较常见的一种病症了,不健康的生活方式和环境使越来越多的人有患病的风险。所以任何人都有可能患糖尿病;糖尿病有哪些症状?除与高血糖有关的三多一少外还有...

by:听友219908563

嵌入式C语言高级丨内存空间应用

在C语言中,其核心和灵魂就是对内存类型资源的操作,这个操作的工具就是指针。本课程嵌入式C语言高级内存空间RAM,将带领大家一起熟悉和掌握C语言指针的操作方法和思...

by:成都星辉科技

喝茶有哪些养生功效

喝茶有哪些养生功效喝茶主要可以起到消除疲劳的作用,可以增强思维能力,同时对于心脑血管也可以起到保护作用,并能中和血液中酸性物质。而儿童经常饮茶则可以预防龋齿,女...

by:海霞煦时