会会大厂面试官五----Redis【内存调整、OOM、淘汰策略、LRU算法】

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 会会大厂面试官五----Redis【内存调整、OOM、淘汰策略、LRU算法】

一、Redis面试复盘


1.1 生产上你们的redis内存设置多大?

1.2 如何配置redis并修改内存的大小?

1.3 如果内存你满了你怎么办?

1.4 redis清内存的方式?

1.5 定期删除、惰性删除了解吗?

1.6 redis缓存淘汰策略?

1.7 redis的LRU了解过吗?会不会手写LRU?


二、Redis内存设置


2.1 查看内存


如果不设置最大内存大小,或者设置最大内存大小为0,在64位操作系统下不限制内存的大小,在32位操作系统下最多使用3GB大小的内存。一般推荐为最大物理内存的3/4

# 1.查看内存大小
127.0.0.1:6379> vi redis.conf
一般为没有配置,为机器的最大内存。
打开设置maxmemory参数,为字节类型bytes,请注意转换。
一般推荐为最大物理内存的3/4。
# 2.设置内存大小100M
maxmemory 104857600
# 3.命令行配置 查询
127.0.0.1:6379> config get maxmemory   
127.0.0.1:6379> config set maxmemory  104857600
# 4.查看内存信息
127.0.0.1:6379> info memory


2.2 内存打满了出现OOM怎么办?


故意修改配置,把最大只设置为1字节。

# 1.故意修改配置,把最大只设置为1字节。  
127.0.0.1:6379> config set maxmemory 1
# 2.存储
127.0.0.1:6379> set k1 v1
# 答案:出现以下OOM
(error)OOM command not allowed when use memory > 'maxmemory'


2.3 redis内存淘汰策略?

20210204155734724.png



默认为不释放内存直到内存满,直到爆出OOM错误。


2.3.1 如果一个键过期了,会不会马上从内存中删除?


不是的

定时删除:立即删除是对CPU不友好的,因为删除操作会占用CPU的时间,如果刚刚碰上了CPU很忙的时候,比如正在排序或者计算的时候,就会给CPu造成压力。

Redis不可能时时刻刻检测所有的key的过期时间。

惰性删除:数据到达了过期时间,不做处理,等到下次访问数据时候,如果发现未过期则返回数据,如果发现过期了,则进行删除。缺点是堆内存不友好的,大量的无用数据占用空间。

定期删除:每个一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率来减少操作对CPU使劲的影响。 周期性的轮询redis的时效性数据,采取随机抽取的策略,利用过期数据占比的方式控制删除频率。


2.3.2 redis6.0.8内存淘汰策略【兜底方案】


20210204161958792.png

2021020416222582.png




三、LRU 算法【哈希链表】


3.1 简介


redis的缓存淘汰策略已经提及过了

Least Recently Used 最近最少使用,是一种常见的页面置换算法。

选择最近最久未被使用的数据进行淘汰。


3.2 Leetcode算法题


运用你所掌握的数据结构,设计和实现一个LRU缓存机制,他应该支持:

获取数据get 如果关键字存在于缓存中,则获取,否则返回-1

写入数据put 如果关键字已经存在,变更数据,如果不存在,则插入。在缓存容量达到>上限时候,删除最近最久未被使用的数据进行删除后在进行插入。


想一想,查找快,插入块,删除快,而且还需要后排序-------?神魔数据结构满足?

你是否可以在O(1)时间复杂度内完成?

LRU【哈希+链表】本质就是HashMap+DoubleLinkedList


3.2.1 参考LinkedHahMap

public class LRUCacheDemo<K,V> extends LinkedHashMap<K,V> {
    // 缓存大小
    private int capacity;
    // 构造方法
    public LRUCacheDemo(int capacity) {
        super(capacity,0.75F,true);
        this.capacity = capacity;
    }
    //
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return super.size() > capacity;
    }
    public static void main(String[] args) {
        LRUCacheDemo lruCacheDemo = new LRUCacheDemo(3);
        lruCacheDemo.put(1,"a");
        lruCacheDemo.put(2,"b");
        lruCacheDemo.put(3,"c");
        System.out.println(lruCacheDemo.keySet());
        lruCacheDemo.put(4,"d");
        System.out.println(lruCacheDemo.keySet());
        lruCacheDemo.put(3,"d");
        System.out.println(lruCacheDemo.keySet());
        lruCacheDemo.put(3,"d");
        System.out.println(lruCacheDemo.keySet());
        lruCacheDemo.put(3,"d");
        System.out.println(lruCacheDemo.keySet());
        lruCacheDemo.put(5,"d");
        System.out.println(lruCacheDemo.keySet());
    }
}

运行结果为:

[1, 2, 3]
[2, 3, 4]
[2, 4, 3]
[2, 4, 3]
[2, 4, 3]
[4, 3, 5]


3.3 哈希+链表

20210205134914984.png


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2天前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
34 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
2月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
2月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
1月前
|
算法
通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法
本项目使用MATLAB2022A版本,对比分析了PSO、反向学习PSO及多策略改进反向学习PSO三种优化算法的性能,主要通过优化收敛曲线进行直观展示。核心代码实现了标准PSO算法流程,加入反向学习机制及多种改进策略,以提升算法跳出局部最优的能力,增强全局搜索效率。
|
1月前
|
NoSQL 算法 Redis
redis内存淘汰策略
Redis支持8种内存淘汰策略,包括noeviction、volatile-ttl、allkeys-random、volatile-random、allkeys-lru、volatile-lru、allkeys-lfu和volatile-lfu。这些策略分别针对所有键或仅设置TTL的键,采用随机、LRU(最近最久未使用)或LFU(最少频率使用)等算法进行淘汰。
42 5
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
2月前
|
算法
优化策略:揭秘钢条切割与饼干分发的算法艺术
本文探讨了钢条切割与饼干分发两个经典算法问题,展示了算法在解决实际问题中的应用。钢条切割问题通过动态规划方法,计算出不同长度钢条的最大盈利切割方式,考虑焊接成本后问题更为复杂。饼干分发问题则采用贪心算法,旨在尽可能多的喂饱孩子,分别讨论了每个孩子一块饼干和最多两块饼干的情况。这些问题不仅体现了数学的精妙,也展示了工程师的智慧与创造力。
45 4
|
2月前
|
存储 NoSQL 算法
阿里面试:亿级 redis 排行榜,如何设计?
本文由40岁老架构师尼恩撰写,针对近期读者在一线互联网企业面试中遇到的高频面试题进行系统化梳理,如使用ZSET排序统计、亿级用户排行榜设计等。文章详细介绍了Redis的四大统计(基数统计、二值统计、排序统计、聚合统计)原理和应用场景,重点讲解了Redis有序集合(Sorted Set)的使用方法和命令,以及如何设计社交点赞系统和游戏玩家排行榜。此外,还探讨了超高并发下Redis热key分治原理、亿级用户排行榜的范围分片设计、Redis Cluster集群持久化方式等内容。文章最后提供了大量面试真题和解决方案,帮助读者提升技术实力,顺利通过面试。
|
2月前
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
359 1