专栏首页java程序员思维redis系列之淘汰删除

redis系列之淘汰删除

往期文章

redis系列基础之简介和安装

redis系列基础篇之配置详解

redis系列基础篇之常用命令

目录

1、过期key主动删除

2、过期key被动删除

3、淘汰策略

redis可以针对key设置过期时间,如果到了过期时间,redis是如何让其失效呢?redis提供了两种让key过期的方法,一种是主动删除,另一种被动删除。

1、过期key主动删除

当读/写一个已经过期的key时,会触发被动删除策略,直接删除掉这个过期key。

被动删除只有key被操作时(如GET),REDIS才会被动检查该key是否过期,如果过期则删除之并且返回NIL。如果系统中存在大量的不经常访问的过期数据,会造成内存的浪费。

优点:被动删除对于cpu友好,不需要消耗cpu资源。

缺点:对于内存不友好,失效的key仍然占用内存。

2、过期key被动删除

由于被动删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key。采用的是贪心算法。key的定期删除会在Redis的周期性执行任务默认每100ms(可以通过hz参数自定义)执行一次,针对每个db,每次循环随机选择20个key判断是否过期,如果一轮所选的key少于25%过期,则终止此次任务。如果超过25%则继续新的一轮选择,如果此次任务超过一定的时间也会被终止,避免长时间消耗cpu,造成性能损耗。

优点:主动删除对于内存友好,能够定期删除一些失效的key,释放内存空间

缺点:对于cpu不友好,需要消耗cpu资源。

注意:hz调大将会提高Redis主动淘汰的频率,如果你的Redis存储中包含很多冷数据占用内存过大的话,可以考虑将这个值调大,但Redis作者建议这个值不要超过100。我们实际线上将这个值调大到100,观察到CPU会增加2%左右,但对冷数据的内存释放速度确实有明显的提高。

如果redis配置了主从,这两种删除,只会在master中执行,然后通过del key的方式同步到slave。

3、淘汰策略

如果失效的key没有被访问,也未被主动删除随机选中,那这个key就永远不会失效吗?

redis中有一个maxmemory配置,即redis最大能使用的内存,当redis的使用内存达到这个值,会根据配置的淘汰策略,对redis的key进行淘汰。

  • volatile-lru:只对设置了过期时间的key进行LRU(默认值)
  • allkeys-lru : 删除lru算法的key
  • volatile-random:随机删除即将过期key
  • allkeys-random:随机删除
  • volatile-ttl : 删除即将过期的
  • noeviction : 永不过期,返回错误

注意:当mem_used内存已经超过maxmemory的设定,对于所有的读写请求,都会触发redis.c/freeMemoryIfNeeded(void)函数以清理超出的内存。注意这个清理过程是阻塞的,直到清理出足够的内存空间。所以如果在达到maxmemory并且调用方还在不断写入的情况下,可能会反复触发主动清理策略,导致请求会有一定的延迟。

主动和被动都是为了提供更多的保障。很多场景都可以使用,如数据之间的同步,数据库mysql和redis的数据同步,主动的方式通过消息队列,通知redis更新,被动的方式使用定时任务,定期全量同步,从而达到数据的一致性。因为通过消息队列,可能会存在消息的阻塞、消息中间件服务不work,消息丢失等异常情况。携程开源框架配置中心apollo,也采用了主动和被动通知的两种方式,主动的方式是config-server和客户端保持长连接,一旦配置发生修改通知客户端,被动方式是客户端定时去向config-server拉取最新的配置。中心思想就是保证服务的高可用,降低出错概率。

END

本文分享自微信公众号 - java程序员思维(java_python_go),作者:曾建路

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • redis系列基础之简介和安装

    redis是一款开源免费的key-value内存数据库,提供多语言api支持,支持Java,C/C++,C#,PHP,JavaScript,Perl,Objec...

    用户4361942
  • redis系列基础篇之常用命

    注意:不要在key很多的服务器中执行此命令,因为redis是单线程,如果key很多,会造成redis阻塞,影响服务性能。

    用户4361942
  • 主动和被动结合,结果是不是会更好?

    主动代表积极,被动代表消极,主动之人步步占领先机,被动之人处处受制于人。但很多情况我们是相对被动的,被动的同时,也请保留主动,结果可能会更好。

    用户4361942
  • Redis-脚本-获取某个大key的值

    在redis中,对于一个很大的key,例如hash类型,直接查看其值会非常慢,于是想到写个脚本通过增量迭代来获取

    用户5522200
  • 玩转Redis|学会这10点让你分分钟拿下Redis,满足你的一切疑问

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日...

    浅羽技术
  • JDK 7/8中的HashMap get/put源码阅读

    王小明_HIT
  • 一文搞懂 flink state key 的设置方式

    前一篇文章 一文搞懂 Flink window 元素的顺序问题 我们已经知道了,state 的获取、更新、清除等都与 key 相关。那么 key 是如何设置的呢...

    shengjk1
  • 面试官: 两个Redis实例怎么快速对比哪些数据不一致

    redis-full-check 是阿里云Redis&MongoDB团队开源的用于校验2个redis数据是否一致的工具,支持单节点、主从、集群版、以及多种pro...

    冷冷
  • HashMap(JDK1.8)源码+底层数据结构分析

    HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。

    黑洞代码
  • Java中HashMap源码分析

    JDK的1.6,1.7版本中,HashMap使用数组+链表来实现的,通过计算Map中的key的的hash值来确定该key在数组中index的位置。计算key在数...

    用户6182664

扫码关注云+社区

领取腾讯云代金券