Redis面试题

Redis面试题

Redis除了做缓存,还有哪些用法?

  1. String:分布式锁;计数器;
  2. hash: 中小型项目购物车;基于套餐,存放对应套餐的机器数据。
  3. list: 点赞功能,显示点赞的人;
  4. set: 小程序抽奖(随机抽取(是否剔除));共同关注的人;可能认识的人。
  5. zset: 排行榜

Redis做分布式锁的时候需要注意哪些问题?

  1. 考虑避免死锁和释放其它锁的场景。
  2. 设置锁和过期时间应该是原子性的。
  3. 业务代码没有执行完成的时候,锁过期了,对锁续期
  4. 释放锁的时候需要保证是锁是当前线程上的锁。

单点部署有什么问题?怎么解决?

单点故障

  1. 主从部署,哨兵模式
  2. 集群部署

简单介绍下RedLock? redisson的实现?

  1. 通过lua脚本保证设置锁和过期时间是原子操作。
  2. 看门狗,异步线程监控锁是否即将过期,而当前线程的锁还没有释放,主动对锁续期
  3. 使用redisson做分布式锁,释放锁前,判断lock.isLocked() && lock.isHeldByCurrentThread()

Redis默认内存是多少?在哪里查看?如何修改?

  1. 默认大小:如果不设置做大内存,或者设置为0,在64位操作系统下不限制内存大小,在32位操作系统小最多使用3GB.

  2. 通过命令,或者配置文件查看redis.conf。

  3. 修改 maxmemory 参数,字节类型单位,注意转换。

    config get maxmemory 	#查看最大内存
    config set maxmemory 1 	#设置最大内存,单位字节
    

在这里插入图片描述

如果Redis内存打满了,会怎么样?

  1. 使用默认配置,同时设置maxmemory的选项,然后set value 测试(version:6.0.8),假如内存达到上限,并且key没有设置过期时间,数据写满会导致memory OOM

    在这里插入图片描述

如果一个键是过期的,那它在过期时间之后会不会马上从内存中删除?

  1. 不会(参考内存过期淘汰策略)

Redis内存过期淘汰策略?

redis 过期键删除策略

  1. 定时删除:对CPU不友好,用处理器性能换取存储空间(拿时间换空间)

    在这里插入图片描述

  2. 惰性删除: 对memory不友好,用存储空间换取处理器性能(拿空间换时间)
    在这里插入图片描述

  3. 定期删除

    在这里插入图片描述

内存淘汰策略
在这里插入图片描述

配置内存淘汰策略

在这里插入图片描述

一般生产上如何配置?

  1. 一般推荐Redis设置内存为最大物理内存的四分之三。(hashMap最大负载因子)

Redis的LRU算法简介。

LRU( least Recently Used)即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的数据予以淘汰。

  1. 基于jdk

    public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    
        private int capacity;
    
        public LRUCache(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) {
            LRUCache<Object, Object> cache = new LRUCache<>(3);
            cache.put("1", "a");
            cache.put("2", "b");
            cache.put("3", "d");
            System.out.println(cache.keySet());
            cache.put("4", "d");
            System.out.println(cache.keySet());
            cache.put("3", "d");
            System.out.println(cache.keySet());
            cache.put("3", "d");
            System.out.println(cache.keySet());
            cache.get("2");
            System.out.println(cache.keySet());
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值