大家好,我是陶然同学,软件工程大三即将实习。认识我的朋友们知道,我是科班出身,学的还行,但是对面试掌握不够,所以我将用这100多天更新Java面试题🙃🙃。
不敢苟同,相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍热门面试题及恰如其分的解答。当然,我不会太深入,因为我怕记不住!!
因此,不足的地方希望各位在评论区补充疑惑、见解以及面试中遇到的奇葩问法,希望这100天能够让我们有质的飞越,一起冲进大厂!!,让我们一起学(juan)起来!!!
Redis删除策略
redis有三种删除策略,分别是(1)定时删除;(2)惰性删除;(3)定期删除
(1)定时删除:在设置某个key 的过期时间同时,为每个设置过期时间的key都创造一个定时器;当
key过期时间到达时,由定时器任务立即执行对键的删除操作;
(2)惰性删除:数据到达过期时间,不做处理,只有访问这个键时才会检查它是否过期,如果过期
则清除,返回不存在;如果未过期,返回数据;
(3)定期删除:每隔一段时间就对一些键进行检查,删除其中过期的键(周期性轮询redis库中的时效
性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度)。该策略是惰性删除和定
时删除的一个折中,既避免了占用大量CPU资源又避免了出现大量过期键不被清除占用内存的情
况。
Redis内存淘汰机制
背景:
Redis 是个基于内存的缓存数据库,既然是基于内存的,那肯定就会有存满的时候,再有新的数据
就存不进去了。
此时 Redis 会执行已经定义好的一些淘汰策略,本文大概讲一下 Redis 的 8 种数据淘汰策略。
8种内存淘汰策略:
当 Redis 达到最大内存限制时,Redis会确切地使用配置好的最大内存策略指令来执行。相关策略
如下:
1. noeviction(默认策略): 不会删除任何数据,拒绝所有写入操作并返回客户端错误消息
(error)OOM command not allowed when used memory,此时 Redis 只响应删和读操作;
2. allkeys-lru: 从所有 key 中使用 LRU 算法进行淘汰(LRU 算法:最近最少使用算法);
3. allkeys-lfu: 从所有 key 中使用 LFU 算法进行淘汰(LFU 算法:最不常用算法,根据使用频率
计算,4.0 版本新增);
4. volatile-lru: 从设置了过期时间的 key 中使用 LRU 算法进行淘汰;
5. volatile-lfu: 从设置了过期时间的 key 中使用 LFU 算法进行淘汰;
6. allkeys-random: 从所有 key 中随机淘汰数据;
7. volatile-random: 从设置了过期时间的 key 中随机淘汰数据;
8. volatile-ttl: 在设置了过期时间的key中,淘汰过期时间剩余最短的。
注意: 当使用 volatile-lru、volatile-lfu、volatile-random、volatile-ttl 这四种淘汰策略时,如果没有
key 可以淘汰,则和 neoviction 一样返回错误。
Redis6.0之前为什么一直不使用多线程
首先要明白,上边的种种分析,都是为了营造一个Redis很快的氛围。官方FAQ表示,因为Redis是
基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带
宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
这里我们一直在强调的单线程,只是在处理我们的网络请求的时候只有一个线程来处理,一个正式
的Redis Server运行的时候肯定是不止一个线程的,这里需要大家明确的注意一下。例如Redis进行持久化的时候会以子进程或者子线程的方式执行。