首页 > 编程知识 正文

redis分布式缓存面试题,redis怎么设置过期策略

时间:2023-05-03 16:28:58 阅读:14709 作者:2725

本文参考你好客网Redis面试问题

Redis面试问题Redis过期策略及实现原理

使用Redis时,Redis的过期策略和实现原理一般设置过期日期。 当然,有些不设定有效期限。 也就是说,有些东西永远不会过期。 设置过期日期时,Redis是如何确定过期日期的,并根据什么策略删除的?

redis过期设置语法以#秒为单位设置过期日期。 这是最常见的方法EXPIRE KEY time#字符串自己的方法SETEX KEY_NAME TIMEOUT VALUE表示,除了字符串自己的有效期设定方法以外,还需要依赖3358www

如果已设置过期日期,但希望缓存随后不再过期,请访问EXPIRE

删除三个过期策略的计划的含义是,在设置KEY过期时间的同时,在该KEY过期时间创建计时器,并在KEY过期时间临时删除计时器。

这种方法可以确保内存快速释放。

缺点过期的密钥越多,删除这些密钥就需要越多的CPU时间;如果CPU时间紧张,CPU就不能将所有时间都用于重要的事情,而必须花时间删除这些密钥。

创建计时器需要时间,如果为每个设置了过期日期的密钥创建计时器,则会产生大量计时器。 对性能的影响会很大。

想和别人在一起的糖豆式删除的意思KEY过期时不删除,每次通过KEY获取值时检查是否过期,过期时删除,返回null。

好处删除操作只在KEY取值时发生,而且只删除当前的KEY,所以占用的CPU时间比较少,而且此时的删除已经到了必须要做的地步。 (如果此时还不删除的话,就会获取过期的密钥。)

缺点如果在大量密钥超过超时时间后很久没有检索到,可能会发生内存泄漏。 无用的垃圾消耗了大量的内存。

定期删除的含义过期密钥的删除操作每隔一定时间执行一次。

通过限制优点删除操作的时间和频率,可以减少删除操作对CPU时间的占用。

缺点是,在存储器使用方便性方面,定期进行"定时删除" (导致一定的存储器占用,但不像想和人在一起的豆瓣式那样占用存储器),在CPU时间的使用方便性方面,"想和人在一起的豆瓣式删除" ),定期进行比较和删除操作

难点在于合理设置删除操作的执行时间(每次删除运行多长时间)和执行频率(每隔多长时间进行删除)。 这取决于服务器的运行状况。 )如果每次的执行时间过长或执行频率过高,对cpu来说会有压力。 每次执行定期删除操作时,都必须记录遍历循环到哪个标志位,并在下一次定期时间到来时从上一个位置开始循环遍历。

说明persist KEY只是使用了惯性消除,redis同时使用惯性消除和定期消除,这也是区别之一。 被认为redis优于memcached。

关于删除想和谁在一起的糖豆式,还有一种方法是设置密钥,如memcached命令,而不是只在获取密钥时检查密钥是否过期。 SETNX命令仅在KEY不存在时设置。 为什么这么说呢,是因为如果不进行过期的密钥检查,直接设定的话就和原来的意思不一样了

定时任务单线程的redis,我怎么知道要执行定时任务?

redis是单线程,线程不仅处理定时任务,还处理客户端请求。 线程在处理定时任务和客户端请求方面无法阻止。 那么,redis如何知道应该执行定时任务呢?

Redis的计划任务记录在称为最小堆的数据结构中。 在这个堆中,运行最快的任务位于堆的顶部。 在每个周期,Redis都会立即处理达到最小堆中点的任务。 处理完成后,记录最早执行的任务所需的时间。 此时间是下一次处理客户端请求的最长时间。 如果达到此时间,则运行计划任务,而不临时处理客户端的请求。

配置Redis使用统一的计时器进行定期删除,计时器的运行时间默认为10秒。 具体构成如下。

如果提高价格,就会消耗更多的cpu。 当然,redis会更准确地处理同时过期的许多密钥和超时。 hz的可取值范围为1~500,通常不推荐超过100,只有在请求延迟非常低的情况下才能使值上升到100。

Redis采用的过期策略表明Redis采用了想和人在一起的糖豆式删除定期删除。

想和人在一起的糖豆式删除过程,在进行GET或SETNX等操作时,首先要检查KEY是否过期; 过期时,删除密钥,执行相应操作; 未过期的,直接执行适当操作; 定期删除过程简单来说,就是为指定的n个库中的每个库随机删除小于或等于指定的m个过期密钥。 具体流程如下。

> 遍历每个数据库(就是 redis.conf 中配置的 ”database” 数量,默认为 16)检查当前库中的指定个数个 KEY(默认是每个库检查 20 个 KEY,注意相当于该循环执行 20 次,循环体是下边的描述)如果当前库中没有一个 KEY 设置了过期时间,直接执行下一个库的遍历随机获取一个设置了过期时间的 KEY,检查该 KEY 是否过期,如果过期,删除 KEY 判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。

对于定期删除,在程序中有一个全局变量 current_db 来记录下一个将要遍历的库,假设有 16 个库,我们这一次定期删除遍历了 10 个,那此时的 current_db 就是 11,下一次定期删除就从第 11 个库开始遍历,假设 current_db 等于 15 了,那么之后遍历就再从 0 号库开始(此时 current_db==0)。

更多

原文链接链接

其他目录

更多文章,可以关注下方公众号:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。