redis的数据都是存放在内存中,而对于服务器来说内存是很有限的,那我们应该如何避免内存耗尽呢?
一、内存回收
在设置redis键值时务必设置过期时间,除开一些需要持久化保存key的场景;
expire key time(以秒为单位)//这是最常用的方式 setex(String key, int seconds, String value)//字符串独有的方式
除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间
二、3种过期策略
定时删除:为每个键设置一个定时器,一旦过期时间到了,则将键删除。这种策略对内存很友好,但是对 CPU 不友好,因为每个定时器都会占用一定的CPU 资源。
惰性删除:不管键有没有过期都不主动删除,等到每次去获取键时再判断是否过期,如果过期就删除该键,否则返回键对应的值。这种策略对内存不够友好,可能会浪费很多内存。
定期扫描:系统每隔一段时间就定期扫描一次,发现过期的键就进行删除。这种策略相对来说是上面两种策略的折中方案,需要注意的是这个定期的频率要结合实际情况掌控好,使用这种方案有一个缺陷就是可能会出现已经过期的键也被返回。
Redis选择的是惰性删除和定期扫描的综合使用。不过 Redis 的定期扫描只会扫描设置了过期时间的键,因为设置了过期时间的键 Redis 会单独存储,所以不会出现扫描所有键的情况;
三、8种淘汰策略
如果服务器内存满了,但是依然继续执行redis的set操作,就会触发淘汰策略,可以通过参数 maxmemory-policy 进行配置;
顺便说说redis内存设置
一般设置为物理内存最大值的3/4;
在redisconf文件里面有个maxmemory,注意单位是字节!!!