专栏首页Java患者Redis过期策略以及淘汰机制

Redis过期策略以及淘汰机制

微信公众号:Java患者 专注Java领域技术分享

redis 过期策略

前言

Redis中可以通过expire设置键的过期,那么Redis又是什么时候删除键的呢?

Redis有三种删除策略:

  • 定时删除:在设置键的过期时间同时,会创建一个定时器,通过设置的时间来执行键的删除操作。
  • 惰性删除:不管设置键的过期时间,只有当每次获取键的同时,检查获取到的键是否已经过期,如果过期就删除该键。
  • 定期删除:每隔一段时间,就对Redis数据库进行一次检查,删除里面过期的键。每次要检查多少个数据库,以及要删除多少个过期的键,由Redis的算法决定。

定时删除

定时删除对内存是比较友好的,毕竟通过定时器删除,可以保证过期就删除不占用多的内存,但是每一个键设置了过期时间就给予一个定时器,这种情况下如果过期键比较多的情况下就很占用CPU。

如果有大量的命令请求到redis服务器,而且服务器当前不缺少内存,那么服务器本应该优先将CPU时间用在处理客户端的七年跪求,但是由于此时有定时器在跑,就会占用CPU在删除过期键上面。

惰性删除

惰性删除策略相对定时删除来看是相反的,程序只会在取出键的时候才会对键进行过期检查,这就可以保证删除过期键的操作只会在获取的时候才会执行,这个策略相对来说不会花费额外的CPU资源,但是如果有一个过期键一直保存在数据库中,而没有获取这个键,这个时候就会对内存造成浪费,没有获取就不会进行资源释放。

定期删除

键的定时删除会在Redis的周期性执行任务(serverCron)中执行,默认 每100ms执行一次。

首先会依次遍历每个db,然后针对每个db,每次循环随机选择20个key来判断是否过期,如果一轮所选择的key少于25%过期,则终止迭次。此外在迭代过程中如果超过了一定的时间限制则终止过期删除的任务。

淘汰机制

Redis中不同位数操作系统中最大占用内存不同,在64位的操作系统中,Redis不限制占用内存,在32位系统中最大占用内存为3GB。也可以通过配置文件修改。

# maxmemory <bytes>

当Redis的内存快耗尽的时候,Redis会启动内存淘汰机制,将部分key清理以腾出内存。

redis中提供了8种淘汰策略,也可以在配置中配置。

# volatile-lru -> Evict using approximated LRU among the keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key among the ones with an expire set.
# allkeys-random -> Remove a random key, any key.
# volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
# noeviction -> Don't evict anything, just return an error on write operations.
#
# LRU means Least Recently Used
# LFU means Least Frequently Used
#
# Both LRU, LFU and volatile-ttl are implemented using approximated
# randomized algorithms.
#
# Note: with any of the above policies, Redis will return an error on write
#       operations, when there are no suitable keys for eviction.
#
#       At the date of writing these commands are: set setnx setex append
#       incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
#       sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
#       zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
#       getset mset msetnx exec sort
#
# The default is:
#
# maxmemory-policy noeviction

lru:算法 Least Recently Used 最近最少使用
  • volatile-lru:表示从已经设置过期时间的数据中挑选出最近使用次数最少的数据进行淘汰;
  • allkeys-lru:表示从所有键数据中挑选出最近最少使用的数据进行淘汰
lfu: 算法 Least Frequently Used 最少频率使用
  • volatile-lfu:在设置了过期时间的key中使用LFU算法淘汰
  • allkeys-lfu:在所有键中使用LFU算法淘汰数据
  • volatile-random: 从已设置了过期时间的数据中选择任意数据进行淘汰
  • allkeys-random:在所有键中随机选择任意数据进行淘汰
  • volatile-ttl:从已设置了过期时间的数据中挑选即将要过期的数据淘汰
  • noeviction:默认配置是这个,当内存使用达到阈值的时候,只读不可写。

可以通过配置maxmemory-policy修改淘汰机制。

资料 · 福利

回复 【加群】即可加入Java技术交流修仙群

回复 【Java】即可获取最新零基础Java视频资料

回复 【激活】即可获取IDEA、datagrip等系统激活方式

回复 【面试题】即可获取Java技术相关面试题

往期 · 精彩

盘点那些互联网APP出现的奇葩bug Redis中String数据类型原理实现

十月一号之后,github新建的默认分支不叫master了

Java面试锦囊(十二)-- Eureka与Zookeeper区别 你连volatile都不在意,你在意什么,在意大利吗

本文分享自微信公众号 - Java患者(gh_3a16ffdedb6a),作者:Zero

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

原始发表时间:2020-10-08

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis过期策略以及内存淘汰机制

    如果你的 Redis 只能存10G数据,你写了12G,那么 Redis 会怎么淘汰那2G数据呢?

    ITer.996
  • Redis的过期策略以及内存淘汰机制

    为什么不用定时删除策略? 定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应...

    traffic
  • Redis过期策略和数据淘汰机制

    redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。除了定时遍历之外,它还会使用惰性策略来删除过期...

    程序员酷森
  • Redis过期策略和内存淘汰机制

    Redis缓存作为提高系统性能最好的方式相信大家对其一定不陌生,各位作为秃头老码农不仅需要掌握Redis的基础用法还得了解Redis的相关原理,比如Redis过...

    JAVA日知录
  • Redis过期key删除策略以及内存淘汰策略

    众所周知,Redis是一种内存级kv数据库,所有的操作都是在内存里面进行,定期通过异步操作把数据库数据flush到硬盘上进行保存。因此它是纯内存...

    高性能架构探索
  • redis的过期策略和内存淘汰机制

    转载自 https://blog.csdn.net/weixin_42463676/article/details/80843711

    allsmallpig
  • redis的过期策略和内存淘汰机制

    定期删除:指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除

    HUC思梦
  • Redis的过期删除策略和内存淘汰机制

    在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时对key进行删除。 优点: 保证内存被尽快释放。 缺点: 1)若过期ke...

    范蠡
  • 理解Redis的内存回收机制和过期淘汰策略

    我们知道Redis是分布式缓存中间件,它是基于内存运行,可是有没有想过比较好的服务器内存也不过几十G,能存多少数据呢,当内存占用满了之后该怎么办呢?需要存储新的...

    黎明大大
  • 理解Redis的内存回收机制和过期淘汰策略

    今天写这篇文章的灵感,来自之前一位好友投稿的面试题:redis 的过期策略有哪些?内存淘汰机制有哪些?我将工作中遇到的问题分析,整理成一篇文章提供大家学习,希望...

    八点半的Bruce、D
  • Redis的过期策略和内存淘汰策略及LRU算法详解

    设置key的过期时间。超时后,将会自动删除该key。在Redis的术语中一个key的相关超时是volatile的。

    JavaEdge
  • Redis 的过期策略和内存淘汰机制有什么区别?

    Redis 和 MySQL 是面试绕不过的两座大山,他们一个是关系型数据库的代表(MySQL),一个是键值数据库以及缓存中间件的一哥。尤其 Redis 几乎是所...

    码农架构
  • Redis的过期策略和内存淘汰策略配置说明

    一旦内存使用达到上限,Redis会根据选定的回收策略(参见:maxmemmory-policy)删除key

    A梦多啦A
  • 面试官:Redis 数据库内存数据满了,会宕机吗?有内存回收?

    Redis 数据库内存数据满了,会宕机吗?答案是:不会让他出现存满的情况,在使用Redis的时候我们要配置Redis能使用的最大的内存大小,存到一定容量的时候还...

    Java_老男孩
  • Redis淘汰机制+热点数据问题

    Redis是内存数据库,我们能时时刻刻能感受到Redis作者为更好地使用内存而费尽各种心思,例如最明显的是对于同一种数据结构在不同应用场景下提供了基于不同底层编...

    xcbeyond
  • 面试官:Redis 内存数据满了,会宕机吗?

    答案是:不会让它出现存满的情况,在使用Redis的时候我们要配置Redis能使用的最大的内存大小,存到一定容量的时候还有Redis的内存淘汰策略呢,还有LRU算...

    Bug开发工程师
  • 面试管:Redis 数据库内存数据满了,会宕机吗?有内存回收?

    Redis 数据库内存数据满了,会宕机吗?答案是:不会让他出现存满的情况,在使用Redis的时候我们要配置Redis能使用的最大的内存大小,存到一定容量的时候还...

    搜云库技术团队
  • Redis详解(十一)------ 过期删除策略和内存淘汰策略

      ②、设置完一个键的过期时间后,到了这个时间,这个键还能获取到么?假如获取不到那这个键还占据着内存吗?

    IT可乐
  • Redis 内存淘汰机制详解

    根据“八二原理“,即 80% 的请求访问了 20% 的数据,因此如果按照这个原理来配置,将 Redis 内存大小设置为数据总量的 20%,就有可能拦截到 80%...

    java乐园

扫码关注云+社区

领取腾讯云代金券