彻底理解Redis的过期策略

devtools/2024/11/26 23:14:24/

一.由来

因为现在Redis的使用是非常普遍的,Redis是基于内存的数据存储系统,而内存相比于早些年而言,还是便宜了很多,但是相比硬盘而言还是最很多,因此提高Redis里面的内存利用率是非常重要,而Redis的过期策略就是提升内存空间利用率的一把利刃,同时还存在另一个利刃就是内存淘汰策略

二.过期策略

两种策略:

1.定期删除:定时定期的删除某些数据;

默认会隔一段时间来Redis中随机抽取一些我们设定了过期时间的Key出来,然后来足个分析这些Key是否已经过期,那么说如果这些Key已经过期了(TTL=0),那么就就会将这些数据进行删除,不会将这个数据直接返回给用户,如果说我们抽取出来的Key中已经过期的Key的占比大于抽取出来的数据的25%,那么代表需要删除的有很多,此时会立刻进入下一轮的随机抽取,直到有一次这个占比小于25%,这个时候才会结束这个随机抽取动作,然后根据设置的间隔时间,才会进入下一轮。

Redis默认是每个100ms就随机抽取一些设置了过期时间的Key,检查是否过期,过期就删除。

但是这种会出现两个问题:

(1)随机抽取出来的这个Key很多的话,就需要足个比对,这个时候就会占用大量的CPU资源,从而会影响到Redis的性能;

(2)随机抽取数据,也就意味着在Redis里面肯定会存在一些漏网之鱼,比如上面的K1值,每次抽取都没有抽到它,但是它已经过去,也就代表这个Key不会被删除掉,它就会继续浪费Redis里面的内存空间。

2.惰性删除:存在一种懒加载的思想在里面,需要触发某个常见才能删除某些数据。 

只有当用户访问到某一个Key的时候,才会进行检查Key是否过期,过期就删除,不返回任何东西,没有访问到的Key就会一直存在Redis中,这也没能解决到定期删除的漏网之鱼问题,也就是这个Key既没有被访问到,也没有被随机抽选到,这个Key还是会继续遗忘在Redis里面,浪费内存空间。

为了解决这个问题,就需要使用到内存淘汰机制,

三.内存淘汰策略

常见八种策略:

它主要涉及到Lru的算法(根据使用时间)Lfu的算法(根据使用频率)

1.noevication(3.0版本后的默认策略):当内存使用超过配置的大小时,直接报错;

2.allkeys-lru:在所有Key里面来实行lru算法,根据算法来删除最久没有使用的键;

3.volatile-lru:在设置了过期时间的Key里面来实行lru算法,根据算法来删除最久没有使用的键;

4.allkeys-random:在所有Key里面,随机挑去一部分Key进行删除;

5.volatile-random:在设置了过期时间的Key里面,随机挑去一部分Key进行删除;

6.volatile-ttl:在设置了过期时间的Key里面根据TTL时间进行筛选数据,其实就是选择剩余时间最短的Key进行删除,比如现在有两个Key,一个Key还有10s过期,一个Key还有20s过期,它会有限删除10s的Key;

7.volatile-lfu:在设置了过期时间的Key里面来实行lru算法,根据算法来删除使用频率最少的键;

8.allkys-lfu:在所有Key里面来实行lfu算法,根据算法来删除使用频率最少的键;

四.问题

1.如果数据库有1000万条数据,而Redis只能缓存20万条数据,如何保证Redis中都是热点数据?

答:可以使用allkeys-lru(挑选最近最少使用的数据淘汰)淘汰策略,这样留下来的都是经常访问的热点数据。

2.当Redis的内存用完了会发生什么?

答:主要取决于数据淘汰策略。如果是默认的配置(noeviction),Redis会直接报错,因为无法删除任何数据以腾出内存空间。


http://www.ppmy.cn/devtools/137242.html

相关文章

淘宝商品评论爬虫:Java版“窃听风云”

在这个信息爆炸的时代,淘宝评论就像是隐藏在商品页面背后的小秘密,等待着我们去发掘。今天,我们将化身为“数据侦探”,使用Java编写一个爬虫程序,潜入淘宝的评论区,窃取那些珍贵的用户反馈。请注意&#xf…

R语言处理JSON文件

R语言处理JSON文件 引言 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript编程语言的一个子集,但JSON是独立于语言的文本格式&#xff0c…

C 语言面向对象

面向对象的基本特性:封装,继承,多态 1.0 面向过程概念 当我们在编写程序时,通常采用以下步骤: 1. 将问题的解法分解成若干步骤 2. 使用函数分别实现这些步骤 3. 依次调用这些函数 这种编程风格的被称作 面向过程…

Python 网络爬虫操作指南

网络爬虫是自动化获取互联网上信息的一种工具。它广泛应用于数据采集、分析以及实现信息聚合等众多领域。本文将为你提供一个完整的Python网络爬虫操作指南,帮助你从零开始学习并实现简单的网络爬虫。我们将涵盖基本的爬虫概念、Python环境配置、常用库介绍。 上传…

解决登录Google账号遇到手机上Google账号无法验证的问题

文章目录 场景小插曲解决方案总结 场景 Google账号在新的设备上登录的时候,会要求在手机的Google上进行确认验证,而如果没有安装Google play就可能出现像我一样没有任何弹框,无法实现验证 小插曲 去年,我在笔记本上登录了Googl…

Flink Standalone集群模式安装部署全攻略

Flink Standalone集群模式安装部署全攻略 一、引言 Flink作为一款强大的分布式流处理和批处理框架,在大数据领域有着广泛的应用。本文将详细介绍Flink Standalone集群模式的安装部署过程,帮助大家快速搭建起开发测试环境。 二、安装前准备 首先&…

电话机器人的发展历程

电话机器人的发展历程 作者:开源呼叫中心系统 FreeIPCC,Github地址:https://github.com/lihaiya/freeipcc 电话机器人的发展历程可以大致分为以下几个阶段: 一、初级阶段:互动式语音应答(IVR)…

【Python】构建事件驱动架构:用Python实现实时应用的高效系统

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 事件驱动架构(Event-Driven Architecture,EDA)是一种基于事件流动进行系统设计的模式,广泛应用于游戏开发、实时监控和分布式系统中。它通过解耦事件的生产者和消费者,提升系统的可扩展性和灵活性。本文章从…