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

73 篇文章 8 订阅
8 篇文章 0 订阅
本文详细探讨了Redis在生产环境中的内存配置,包括如何设置最大内存大小以及遇到内存满时的处理策略。重点讨论了Redis的内存淘汰策略,如惰性删除和定期删除,以及LRU算法的工作原理。此外,还介绍了LRU缓存机制的实现,使用哈希链表(LinkedHashMap)作为数据结构来确保O(1)的时间复杂度。
摘要由CSDN通过智能技术生成

一、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内存淘汰策略?

在这里插入图片描述
默认为不释放内存直到内存满,直到爆出OOM错误。

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

不是的
定时删除:立即删除是对CPU不友好的,因为删除操作会占用CPU的时间,如果刚刚碰上了CPU很忙的时候,比如正在排序或者计算的时候,就会给CPu造成压力。
Redis不可能时时刻刻检测所有的key的过期时间。
惰性删除:数据到达了过期时间,不做处理,等到下次访问数据时候,如果发现未过期则返回数据,如果发现过期了,则进行删除。缺点是堆内存不友好的,大量的无用数据占用空间。
定期删除:每个一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率来减少操作对CPU使劲的影响。 周期性的轮询redis的时效性数据,采取随机抽取的策略,利用过期数据占比的方式控制删除频率。

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

在这里插入图片描述
在这里插入图片描述

三、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 哈希+链表

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding路人王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值