一、默认内存大小
默认在64位操作系统下是不限制内存大小的,在32位操作系统下是3G。
二、推荐设置内存的大小
推荐为最大物理内存的75%。(关键字:HashMap的负载因子默认为0.75)
三、三种过期key的删除策略
当一个key过期了,并不是立即从Redis中删除。而是以下三种方式:
1、立即删除
优点
- 能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放
缺点
- 对cpu是最不友好的。因为实时删除操作会占用cpu的时间
总结
- 对CPU不友好,用处理器性能换取存储空间 (拿时间换空间)
2、惰性删除
key到达过期时间时,不做处理。等到下次访问时判断,如果过期则删除key,未过期则返回数据。
优点
- 节省处理器性能
缺点
- 占用空间大
- 如果redis中存在大量不再使用的过期key,则一直无法删除,除非手动FLUSHDB。
总结
- 对内存不友好,用存储空间换取处理器性能(拿空间换时间)
3、定期删除
定期删除策略是前两种策略的折中,定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。
周期性的轮询Redis库中的时效性数据,采取随机抽取的策略,利用过期数据占比的方式控制删除额度
- 特点1:CPU性能占用设置有峰值,检测频度可自定义设置
- 特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理
总结
- 周期性抽查存储空间 (随机抽查,重点抽查)
定期删除策略的难点是确定删除操作执行的时长和频率:如果删除操作执行得太频繁,或者执行的时间太长,定期删除策略就会退化成立即删除策略,以至于将CPU时间过多地消耗在删除过期键上面。如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除束略一样,出现浪费内存的情况。因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率。可能存在漏网之鱼,一直没有被抽取过。
四、八种内存淘汰策略
1、八种策略
noeviction: 不会驱逐任何key,即当内存超出限制后,报错返回OOM,但不驱逐任何key(出厂默认配置)
allkeys-lru: 对所有key使用LRU算法进行删除(推荐)
volatile-lru: 对所有设置了过期时间的key使用LRU算法进行删除
allkeys-random: 对所有key随机删除
volatile-random: 对所有设置了过期时间的key随机删除
volatile-ttl: 删除马上要过期的key
allkeys-lfu: 对所有key使用LFU算法进行删除
volatile-lfu: 对所有设置了过期时间的key使用LFU算法进行删除
LRU:Least Recently Used 最近最少使用。
LFU:Least Frequently Used 最不常使用。
2、总结
2 * 4 = 8
2是指2个维度
- 过期键中筛选
- 所有键中筛选
4是指4个方面
- LRU
- LFU
- random:随机
- ttl:过期时间