前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >redis手动删除过期key(redis过期键的删除策略)

redis手动删除过期key(redis过期键的删除策略)

作者头像
全栈程序员站长
发布于 2022-07-31 04:45:18
发布于 2022-07-31 04:45:18
2.5K0
举报

大家好,又见面了,我是你们的朋友全栈君。

本篇博客是Redis系列的第5篇,主要讲解下Redis的过期键删除策略。

本系列的前4篇可以点击以下链接查看:

Redis系列(一):Redis简介及环境安装

Redis系列(二):Redis的5种数据结构及其常用命令

Redis系列(三):Redis的持久化机制(RDB、AOF)

Redis系列(四):Redis的复制机制(主从复制)

划重点:Redis的过期键删除策略也是面试中经常会被问的,我最近面试,被问到了好几次。

对于Redis服务器来说,内存资源非常宝贵,如果一些过期键一直不被删除,就会造成资源浪费,

因此我们需要考虑一个问题:如果一个键过期了,它什么时候会被删除呢?

1. 常见的删除策略

常见的删除策略有以下3种:

  1. 定时删除 在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
  2. 惰性删除 放任过期键不管,每次从键空间中获取键时,检查该键是否过期,如果过期,就删除该键,如果没有过期,就返回该键。
  3. 定期删除 每隔一段时间,程序对数据库进行一次检查,删除里面的过期键,至于要删除哪些数据库的哪些过期键,则由算法决定。

其中定时删除和定期删除为主动删除策略,惰性删除为被动删除策略。

接下来我们一一讲解。

1.1 定时删除策略

定时删除策略通过使用定时器,定时删除策略可以保证过期键尽可能快地被删除,并释放过期键占用的内存。

因此,定时删除策略的优缺点如下所示:

  1. 优点:对内存非常友好
  2. 缺点:对CPU时间非常不友好

举个例子,如果有大量的命令请求等待服务器处理,并且服务器当前不缺少内存,如果服务器将大量的CPU时间用来删除过期键,那么服务器的响应时间和吞吐量就会受到影响。

也就是说,如果服务器创建大量的定时器,服务器处理命令请求的性能就会降低,

因此Redis目前并没有使用定时删除策略。

1.2 惰性删除策略

惰性删除策略只会在获取键时才对键进行过期检查,不会在删除其它无关的过期键花费过多的CPU时间。

因此,惰性删除策略的优缺点如下所示:

  1. 优点:对CPU时间非常友好
  2. 缺点:对内存非常不友好

举个例子,如果数据库有很多的过期键,而这些过期键又恰好一直没有被访问到,那这些过期键就会一直占用着宝贵的内存资源,造成资源浪费。

1.3 定期删除策略

定期删除策略是定时删除策略和惰性删除策略的一种整合折中方案。

定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响,同时,通过定期删除过期键,也有效地减少了因为过期键而带来的内存浪费。

2. Redis使用的过期键删除策略

Redis服务器使用的是惰性删除策略和定期删除策略。

2.1 惰性删除策略的实现

过期键的惰性删除策略由expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查:

  • 如果输入键已经过期,那么将输入键从数据库中删除
  • 如果输入键未过期,那么不做任何处理

以上描述可以使用如下流程图表示:

2.2 定期删除策略的实现

过期键的定期删除策略由activeExpireCycle函数实现,每当Redis服务器的周期性操作serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。

activeExpireCycle函数的大体流程为:

函数每次运行时,都从一定数量的数据库中随机取出一定数量的键进行检查,并删除其中的过期键,比如先从0号数据库开始检查,下次函数运行时,可能就是从1号数据库开始检查,直到15号数据库检查完毕,又重新从0号数据库开始检查,这样可以保证每个数据库都被检查到。

划重点:

  1. 关于定期删除的大体流程,最近面试时有被问道,我就是按上述描述回答的。
  2. 可能有的面试官还会问,每次随机删除哪些key呢?可以提下LRU算法(Least Recently Used 最近最少使用),一般不会再细问,不过有兴趣的同学可以深入研究下。

3. RDB对过期键的处理

3.1 生成RDB文件

在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中

举个例子,如果数据库中包含3个键k1、k2、k3,并且k2已经过期,那么创建新的RDB文件时,程序只会将k1和k3保存到RDB文件中,k2则会被忽略。

3.2 载入RDB文件

在启动Redis服务器时,如果服务器只开启了RDB持久化,那么服务器将会载入RDB文件:

  • 如果服务器以主服务器模式运行,在载入RDB文件时,程序会对文件中保存的键进行检查,未过期的键会被载入到数据库中,过期键会被忽略。
  • 如果服务器以从服务器模式运行,在载入RDB文件时,文件中保存的所有键,不论是否过期,都会被载入到数据库中。 因为主从服务器在进行数据同步(完整重同步)的时候,从服务器的数据库会被清空,所以一般情况下,过期键对载入RDB文件的从服务器不会造成影响。

4. AOF对过期键的处理

4.1 AOF文件写入

如果数据库中的某个键已经过期,并且服务器开启了AOF持久化功能,当过期键被惰性删除或者定期删除后,程序会向AOF文件追加一条DEL命令,显式记录该键已被删除。

举个例子,如果客户端执行命令GET message访问已经过期的message键,那么服务器将执行以下3个动作:

  1. 从数据库中删除message键
  2. 追加一条DEL message命令到AOF文件
  3. 向执行GET message命令的客户端返回空回复

4.2 AOF文件重写

在执行AOF文件重写时,程序会对数据库中的键进行检查,已过期的键不会被保存到重写后的AOF文件中

5. 复制功能对过期键的处理

在主从复制模式下,从服务器的过期键删除动作由主服务器控制

  • 主服务器在删除一个过期键后,会显式地向所有从服务器发送一个DEL命令,告知从服务器删除这个过期键。
  • 从服务器在执行客户端发送的读命令时,即使发现该键已过期也不会删除该键,照常返回该键的值。
  • 从服务器只有接收到主服务器发送的DEL命令后,才会删除过期键。

6. 源码及参考

黄健宏 《Redis设计与实现》

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128475.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
pac模式与全局模式哪个好_直连模式pac模式全局模式
PAC模式:国内网站依旧走本地网络,速度快,绝大部分国外网站都走代理,速度也快。。
全栈程序员站长
2022/11/04
13.1K0
pac模式与全局模式哪个好_直连模式pac模式全局模式
直连模式,pac模式和全局模式哪个好_全局代理模式
直连模式: 就是直接连接,没有经过任何协议节点,和没开网络代理模式一样,相当于关闭网络代理。 全局模式: 意思是访问所有网站都走代理节点。这种模式访问国内网站速度略慢,并且耗费流量。 PAC模式: 根据pac文件来判断访问时需不需要经过代理,较为智能,省流量。但是较为依赖pac规则,小众网站可能不经过代理,需要自己编辑规则,或者切换全局代理模式。
全栈程序员站长
2022/11/02
6.3K0
关于代理模式PAC和全局模式的区别「建议收藏」
综合上述,无特殊情况下,建议大家可选用PAC模式。 说明:只有PAC模式可用的情况下(即:PAC模式可以打开google网站),才能使用全局模式;如果pac模式不可用,全局模式是打不开任何网页的。
全栈程序员站长
2022/11/02
12.3K0
【流量代理】代理模式「建议收藏」
顾名思义直连模式就是不使用任何代理的模式,这种模式下你访问网站时不会走代理ip还是你自己的。
全栈程序员站长
2022/11/02
1K0
PAC模式和全局模式
【PAC模式】也就是智能分流模式,根据规则去匹配你访问的网站,仅加速国外网站,国内网站不受影响,非常智能;
全栈程序员站长
2022/11/02
11K0
腾讯云搭建Socks5多IP代理服务器实现游戏单窗口单IP完美搭建教程附带工具「建议收藏」
https://cloud.tencent.com/document/product/1199/41648#eip-.E9.85.8D.E9.A2.9D.E9.99.90.E5.88.B6
全栈程序员站长
2022/06/25
33.8K3
腾讯云搭建Socks5多IP代理服务器实现游戏单窗口单IP完美搭建教程附带工具「建议收藏」
策略篇&访问策略 ❀ (5.4) 01. Explicit Web Proxy 显式web代理 ❀ 飞塔 (Fortinet) 防火墙
【简介】提供代理服务的计算机或其它类型的网络节点称为代理服务器,其具体过程为:客户端首先与代理服务器创建连接,接着发出一个对另外的目标服务器的文件或其它资源的连接请求,代理服务器通过与目标服务器连接或从缓存中取得请求的资源,并返回给客户端。通常在这个过程中,代理服务器可能改变客户端请求或服务器端响应的一些内容以满足各种代理需要。
全栈程序员站长
2022/06/24
1.5K0
策略篇&访问策略 ❀ (5.4) 01. Explicit Web Proxy 显式web代理 ❀ 飞塔 (Fortinet) 防火墙
Windows常见协议之 WPAD(Web代理自动发现协议)
WPAD全称Web Proxy Auto-Discovery Protocol,也就是WEB代理自动发现协议(这里的代理就是我们在渗透中常用BURP的时候修改的代理设置)。它的作用是让局域网浏览器自动发现内网中的代理服务器,并且自动设置成该代理进行连接企业内网或者互联网。若系统开启了WPAD,那么主机就会在当前连接的局域网中去寻找代理服务器,找到之后会在代理服务器中下载PAC(Proxy Auto-Config)的配置文件(其实我们在日常中经常能看见当我们使用SSR的时候就会看见PAC自动模式),这个PAC文件会定义用户在访问什么地址的时候,使用什么代理进行访问,举一个常见易懂的例子,有些公司会对访问谷歌浏览器有一定的需求,那么他们就会搭建一个代理服务器,里面的PAC文件就会配置当访问谷歌浏览器的时候web代理自动使用到那个代理服务器上,同时浏览器将下载并解析该文件,将相应的代理服务器设置到浏览器中。
一只特立独行的兔先生
2024/01/26
1.2K0
Windows常见协议之 WPAD(Web代理自动发现协议)
一款神器的代理设置工具SwitchyOmega
经常使用代理的大佬们肯定知道这款插件,如果你有访问国外网站的需求可以了解下SwitchyOmega这款插件,用了之后你会无法自拔!
Lcry
2022/11/29
6.8K0
一款神器的代理设置工具SwitchyOmega
爬虫为啥需要大量的ip_简述网络爬虫的工作原理
爬虫工作者在试用爬虫进行数据搜集的过程中经常会遇到这样的情况,刚开始的时候爬虫的运行情况是正常的,数据的抓取状况也在有条不紊的进行着,然而可能你一眼照顾不到就会出现错误,比如403 Forbidden,这时候你打开网页的话,网页上面会提示你,“您的IP访问频率太高”这样的字眼。出现这种现象的原因就是被访问网站采取了反爬虫机制,比如,服务器会检测某个IP在单位时间内的请求次数,如果超过了这个阈值,就会直接拒绝服务,返回一些错误信息,这种情况可以称为封IP。
全栈程序员站长
2022/11/10
4780
http,socks5,socks4代理的区别[通俗易懂]
HTTP代理:能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80、8080、3128等; SOCKS代理:SOCKS代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心是何种应用协议,既可以是HTTP请求,所以SOCKS代理服务器比其他类型的代理服务器速度要快得多。
全栈程序员站长
2022/07/02
5K0
linux做代理服务器_linux搭建http下载服务器
首先, Tor官方提供已不再提供单独的Tor内核下载,只提供集成了Tor内核的Tor-Browser下载。Tor Browser 内置了Tor,firefox,配置工具等,使用方便,但是安装和启动需要依赖GUI图形界面,在Windows或者Mac系统上推荐安装Tor-Browser,会简便很多。如果Linux上没有安装图形界面系统,如代理服务器VPS等,是无法安装Tor-Browser的,这个情况下可以通过安装Tor内核软件的方式实现TOR代理功能。
全栈程序员站长
2022/11/11
3.6K0
用ccproxy + stunnel做个加密代理「建议收藏」
目前国内用户无法访问某些国外网站,如http://zh.wikipedia.org等,如果在国外托管有服务器的话,就可以自己做个加密代理,让自己畅通上网。
全栈程序员站长
2022/09/07
2.3K0
常用#免费%代理IP库&整理*收藏——实时@更新(大概)
如果还有其他好的免费代理网站,欢迎评论区留言交流,会实时更新到文章中;如有已经失效的也欢迎私信留言,博主会及时修改反馈!!!
全栈程序员站长
2022/11/11
2.7K0
HTTP默认端口_http协议使用的端口号
80是http协议的默认端口,是在输入网站的时候其实浏览器(非IE)已经帮你输入协议了,所以你输入http://baidu.com,其实是访问http://baidu.com:80。而8080,一般用与webcahe,完全不一样的两个,比如linux服务器里apache默认跑80端口,而apache-tomcat默认跑8080端口,其实端口没有实际意义只是一个接口,主要是看服务的监听端口。
全栈程序员站长
2022/09/29
3.5K0
nginx反向代理和正向代理的区别是什么_nginx负载均衡的三种方式
nginx反向代理和正向代理的区别是什么?下面本篇文章就来给大家介绍一下,希望对你们有所帮助。
全栈程序员站长
2022/11/03
4960
Sublime Text3使用Package Control 报错There Are No Packages Available For Installation
前言:原创不易,转载请告知并注明出处!公众号【机器学习与自然语言处理】 在使用sublime时,有时候我们希望将代码复制出来后仍然是高亮显示,这样我们便需要安装SublimeHighLight插件,在安装SublimeHighLight插件之前,我们应该先安装Package Control插件!
全栈程序员站长
2022/09/14
4410
Sublime Text3使用Package Control 报错There Are No Packages Available For Installation
pycharm支持中文吗_代理是怎么做的
如果是通过.pac文件上网,需要获取.pac文件的内容然后找到其中的代理服务器IP和端口填写至上述代码的响应位置。
全栈程序员站长
2022/09/25
5730
Ubuntu设置代理服务器
由于公司网络的原因,apache的网站访问不了,对于需要经常访问apache网站查看文档的我,最近想了一种方法,在自己的阿里云服务器上搭建一个代理服务器。经过查资料,最终决定使用TinyProxy。 首先在代理服务器上安装TinyProxy,安装步骤如下:
全栈程序员站长
2022/09/07
3.4K0
Ubuntu设置代理服务器
sublime前端插件
CSS3 链接: https://github.com/y0ssar1an/CSS3 简介: 支持CSS3里的语法高亮。(Sublime3里自带的CSS高亮不够用)。安装后, 打开一个CSS文件,然后按照下面GIF操作,将CSS3高亮作为CSS文件的默认高亮:
全栈程序员站长
2022/09/12
8740
推荐阅读
相关推荐
pac模式与全局模式哪个好_直连模式pac模式全局模式
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1. 常见的删除策略
    • 1.1 定时删除策略
    • 1.2 惰性删除策略
    • 1.3 定期删除策略
  • 2. Redis使用的过期键删除策略
    • 2.1 惰性删除策略的实现
    • 2.2 定期删除策略的实现
  • 3. RDB对过期键的处理
    • 3.1 生成RDB文件
    • 3.2 载入RDB文件
  • 4. AOF对过期键的处理
    • 4.1 AOF文件写入
    • 4.2 AOF文件重写
  • 5. 复制功能对过期键的处理
  • 6. 源码及参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档