• 【Redis】面试常见问题


    1.redis有哪些基本数据类型?

    整数、字符串、hash表、链表、跳表、压缩表

    2.redis有哪些数据结构?

    string、list、hash、set、zset除此之外还有HyperLogLog(大数据基数估算)、Geo(地理位置信息)和BloomFilter(布隆过滤器)

    3.一个请求进来的时候,Redis 怎么找到对应的数据的?

    请求会由一个socket监听接收,进入循环等待上一个socket执行完成,唤醒,在子线程中开始执行,获取到数据后,写入缓存,写入socket,关闭socket输出

    4.单线程的redis为什么这么快?

    (1)表结构为散列表,时间复杂度为O(1)
    (2)存在内存中,不需要磁盘IO
    (3)采用多路复用

    5.redis持久化策略

    RDB快照,AOF增量
    RBD快照首先fork出一个子进程在后台拷贝一份快照,采用的方式是被动监听,一旦有数据变动,系统会执行COW(Copy on write)持久化到快照中,保证快照的实时更新
    AOF增量:将操作步骤先经过逻辑处理后写入缓存中,等到一定容量或者到达1s中时,异步刷入AOF日志中,更安全

    6.redis的过期策略以及内存淘汰机制

    redis采用定期删除+惰性删除策略。
    定期删除:redis每过100ms会抽样调取一部分数据检查是否过期,过期则删除。
    惰性删除:每次获取key时,会再检查一遍是否过期,过期则删除。
    如果长时间不调用,定期删除又没有检查出来,会导致内存占用不断变大,这时需要内存淘汰机制
    (1)不淘汰:noeviction
    (2)定期时间:volitale-random(随机)、volitale-ttl(过期时间)、volitale-lru(最近最少)、volitale-lfu(最小访问频率)
    (3)所有:allkeys-random(随机)、allkeys-lru(最近最少)、allkeys-lfu(最小访问频率)

    7.Redis 集群的时候怎么存放数据?我要扩容怎么办?

    根据不同的业务场景有不同的路由算法存放数据:一致性hash算法、取模hash算法、区域hash算法
    根据算法路由到对应的Node节点,再存放数据。
    扩容时:如果是一致性hash算法直接添加节点,如果是取模或区域最好按倍扩容

    8.手撕LRU算法

    public class LRUCache extends LinkedHashMap {
        private int capacity;
    
        public LRUCache(int capacity){
            //accessOrder设为true意为按照访问的顺序排序
            super(16,0.75f,true);
            this.capacity = capacity;
        }
    
        // 当前大小大于等于容量
        @Override
        protected boolean removeEldestEntry(Map.Entry eldest) {
            return super.size()>=capacity;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    【 Maven 】花式玩法之多模块项目
    ArrayList与顺序表
    让学前端不再害怕英语单词(四)
    动态规划:区间动态规划
    Leetcode刷题167. 两数之和 II - 输入有序数组
    对思维进化的理解
    git新建仓库提交项目代码+常用命令
    【算法-哈希表4】 三数之和(去重版)
    交易中最佳的建仓时机,fpmarkets一个指标搞定
    【论文阅读】Densenet:Densely Connected Convolutional Networks 密集连接的卷积网络
  • 原文地址:https://blog.csdn.net/qq_36015612/article/details/126847405