Redis 数据删除策略
1、Redis数据特性
Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态,有三种状态:
XX:具有时效性的数据;
-1:永久有效的数据;
-2:已经过期的数据 或 被删除的数据 或 未定义的数据;
2、时效数据存储结构:
3、数据删除的策略:
- 定时删除
- 惰性删除
- 定期删除
4、数据删除策略的目标:
在内存中占用与CPU占用 之间寻找一种平衡,顾此失彼都会造成Redis性能的下降,甚至引发服务器宕机或者内存泄漏.
4.1、 定时删除: 用时间换空间
创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务执行立即对键key的删除操作.
优点:节约内存,到时候就删除,快速释放掉不必要的内存占用;
缺点: CPU压力很大,无落CPU此时负载多高,均占用CPU,会影响Redis服务器相应时间和指令吞吐量;
4.2、惰性删除: 用空间换时间
在数据到达过期时间时,不做处理.当下次访问时,若数据过期则删除,返回不存在,否则返回数据;
优点: 节约CPU性能,发现必须删除的时候才删除;
缺点: 内存压力大,出现长期占用内存的数据;
4.3、定期删除: 随机抽查,重点抽查
周期性的轮训Redis中设置过期时效的数据,随机抽取数据,若过期则删除;
5、Redis内存淘汰策略
5.1、检测全库数据:(所有数据集server.db[i].dict)
- allkeys-lru: 从所有的数据中挑选最近最少使用的key数据淘汰;
- allkeys-random:从所有的数据中随机的挑选数据进行淘汰;
- allkeys-lfu: 从所有数据中挑选不经常使用的数据进行淘汰;
5.2、检测容易失去的数据:(可能会过期的数据集server.db[i].expires)
- volatile-lru: 从已设置过期时间的数据中挑选最近最少使用的数据淘汰;
- volatile-random: 从已设置过期时间的数据中,任意挑选数据淘汰;
- volatile-ttl: 从设置过期时间的数据中挑选即将过期的数据进行淘汰;
- volatile-lfu: 从已设置过期时间的数据中挑选不经常使用的数据进行淘汰;
5.3、放弃数据驱逐:
- no-eviction: 禁止淘汰数据,内存不足时,报出错误;(redis4.0中默认策略)
6、逐出算法:
该算法是在Redis使用内存存储前,通常会调用freeMemoryIfNeeded()检测内存是否充足,若内存不满足新加入数据的最低内存要求,Redis要临时删除一些数据作为当前指令清理存储空间.清除数据的策略即为逐出策略.
**注:**逐出过程不是100%清理足够的内存,而是反复尝试,若处理完依旧无法满足,则报出错误:
(error)OOM command not allowed when used memory>'maxmemory'