修改内存大小(不能解决问题,只是限定最大内存大小)
一般默认大小设置为100M,第一种配置:修改大小,Redis内部执行config set maxmemory 100M。如果不设置最大内存大小或者设置为0。则在64位操作系统中不限制内存大小,在32位系统下最多限制3GB; 第二种配置为:配置文件配置其大小:maxmemory 100M。此配置文件不是Redis.conf文件,是java调用Redis的配置文件。
Redis的内存淘汰策略:
Redis定义了几种策略来处理内存用完的情况;
默认策略,基于LRU算法的淘汰(分为所有key和过期的key中),基于随机淘汰(分为所有key和过期的key中),基于Lfu的淘汰
LRU 算法:
最近最少使用,缓存置换算法。当缓存已满时,此时想要再插入缓存,此时想要再插入缓存,就要淘汰已有的缓存。此时用到LRU算法,会在最近没被使用,或在以后也不怎么会使用的缓存中淘汰。
LFU算法:
在LRU中可能会按照使用时间的新旧来处理缓存级别。但是在LFU算法中,则不会产生如偶尔使用一次很久没使用郭的数据时使其成为热点数据的情况。
Redis的内存淘汰是抽取5个key,淘汰最少被使用的key。5是默认数量,可通过配置参数修改其大小,数量越大越符合LRU算法。(Redis在key后加入一个24bit的字段,专门用来存在最后使用的时间)
Redis 3.0以后,增加了候选池(默认大小16)。会默认将第一批key放入候选池,后续的key缓存满了之后,会争候选池外的key与内的值相比较,移除掉最近访问时间的key值。如果要淘汰的话,则淘汰掉最久未被使用的值。
上述总结:
- 会把所有的key按顺序排列,然后随机抽取默认大小的数量放入到候选池;
- 后续随机抽取的值与候选池中的值进行比较,最久没被访问的值替换掉池中最新被访问的值;
- 当需要被淘汰值时,从池中淘汰出最久未被访问的值。
Redis 4.0 以后增加了LFU算法的淘汰策略:
它会在所有key中淘汰最少访问次数的key,保留最大访问次数的key。
有两种策略:
- 在所有key中选择
- 在设置过期时间的key中选择