39.【面试宝典】面试宝典-redis过期k值回收策略,缓存淘汰策略

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【面试宝典】面试宝典-redis过期k值回收策略,缓存淘汰策略

删除策略(回收策略):是当数据到期,redis对过期数据的处理策略。

比如验证码、token等。当数据过了期限后,应该要被删除。

合集参考:面试宝典


Redis中提供了三种删除策略:


1、定时删除当放入数据后,设置一个定时器,当定时器读秒完毕后,将对应的数据从dict中删除。

优点: 内存友好,数据一旦过期就会被删除 缺点: CPU不友好,定时器耗费CPU资源,尤其是当CPU还在尽力处理其他事情的时候,这时候如果有key过期,就可能两边(redis和其他服务)体验都不好,并且当定时key越多,分配的资源就越多,就越影响性能

用时间换空间

2、惰性删除当数据过期的时候,不做任何操作。当访问数据的时候,查看数据是否过期,如果过期返回null,并且将数据从内存中清除。如果没过期,就直接返回数据。

优点: CPU友好,数据等到过期并且被访问的时候,才会删除。 缺点: 内存不友好,会占用大量内存,有较大的OOM风险

用空间换时间

3、定期删除定期删除是定时删除和惰性删除的折中方案。 每隔一段时间对redisServer中的所有redisDb的expires依次进行随机抽取检查。 具体来说,就是周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。 这样做有两个特点:

cpu性能占用设置有峰值,检测频度可自定义设置。 内存压力不是很大,长期占用内存的冷数据会被持续清理。


原理


(1)redis中有一个server.hz定义了每秒钟执行定期删除的次数,每次执行的时间为250ms/server.hz。

(2)redis中会维护一个current_db变量来标志当前检查的数据库。current_db++,当超过数据库的数量的时候,会重新从0开始。

(3)定期检查就是执行一个循环,循环中的每轮操作会从current_db对应的数据库中随机依次取出w个key,查看其是否过期。如果过期就将其删除, 并且记录删除的key的个数。如果过期的key个数大于w25%,就会继续检查当前数据库,当过期的key小于w25%,会继续检查下一个数据库。

(4)当执行时间超过规定的最大执行时间的时候,会退出检查。

(5)一次检查中可以检查多个数据库,但是最多检查数量是redisServer中的数据库个数,也就是最多只能从当前位置检查一圈。


伪代码


time_limit = 250ms/server.hz;
//每次检查运行的最大时间
for(int current_db = 0;current_db < dbs_per_call;current_db++){
//dbs_per_call为server中数据库的个数,也就是每次检查最多检查一轮所有的数据库
  redisDb = redisServer.db[current_db];
  //获取数据库的过期哈希表
  expires = redisDb.expires;
    //获取开始的时间
    long start = time();
    int expired = 0;
    int w = 20;
    do{
       int i = 0;
       while(i++ < w){
           long now = time();
           //如果随机找的key过期了
           if(expire(now,random(expires))){
               //过期数量++
               expired ++;
           }
       }
       //如果运行时间超过了规定时间,就退出检查,下一次定期检查直接检查下一个数据库
       if(time() - start > timelimit){
           return;
       }
     //如果过期数量超过25%,继续检查当前数据库
    }while(expired > w * 25%);


优点: 通过控制定时时间来动态的调整CPU和内存之间的状态,十分灵活。

缺点: 定期删除的定时时间十分重要,如果时间过短,就会对CPU造成很大压力。如果时间过长,就会造成过期数据挤压内存。

难点: 定期删除策略的难点是不确定删除操作执行的时长和频率

如果删除操作执行的太频繁或者执行的时间太长,定期删除策略就会退化成定时删除策略,以至于将CPU时间过去的消耗在删除过期键上面。

如果删除操作执行的太少或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况。因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率。


淘汰策略:是当数据放不下的时候,淘汰其他数据的策略。


网络异常,图片无法展示
|

网络异常,图片无法展示
|

1)noeviction: 不删除,直接返回报错信息。

2)allkeys-lru:移除最久未使用(使用频率最少)使用的key。

3)volatile-lru:在设置了过期时间的key中,移除最久未使用的key。

4)allkeys-random:随机移除某个key。

5)volatile-random:在设置了过期时间的key中,随机移除某个key。

6)volatile-ttl: 在设置了过期时间的key中,移除准备过期的key。

7)allkeys-lfu:移除最近最少使用的key。

8)volatile-lfu:在设置了过期时间的key中,移除最近最少使用的key。

allkeys-xxx:allkeys开头的是对Redis中的所有key都在淘汰范围内。

volatile-xxx:volatile开头的是对Redis中的设置了超时时间的key列入淘汰范围。


如何配置


1.获取和配置Redis能使用的最大内存大小

方式一:修改配置文件中的 maxmemory,放开注释, 根据业务需求设置大小

maxmemory <100mb    
#设置最大内存大小为100MB

方式二:命令行设置

127.0.0.1:6379> config get maxmemory    
#命令行查看当前设置最大内存
127.0.0.1:6379> config set maxmemory 100mb    
#设置Redis最大占用内存大小为100MB

如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存。32 位的机器最大只支持 4GB 的内存,而系统本身就需要一定的内存资源来支持运行,所以 32 位机器限制最大 3 GB 的可用内存。

2.获取和配置redis内存淘汰策略

方式一:修改配置文件中的 maxmemory-policy ,放开注释,根据业务需求修改即可

maxmemory-policy noeviction    
#noeviction 为默认的策略,根据业务需求修改即可

方式二:命令行设置

127.0.0.1:6379> config get maxmemory-policy    
#命令行查看当前淘汰策略
127.0.0.1:6379> config set maxmemory-policy noeviction     
#noeviction 为默认的策略


公众号,感谢关注

网络异常,图片无法展示
|


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
0
0
76
分享
相关文章
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
180 85
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
45 16
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期实操教学-应对高并发,利用云数据库 Tair(兼容 Redis®)缓存实现极速响应
本文介绍了如何通过云端问道21期实操教学,利用云数据库 Tair(兼容 Redis®)缓存实现高并发场景下的极速响应。主要内容分为四部分:方案概览、部署准备、一键部署和完成及清理。方案概览中,展示了如何使用 Redis 提升业务性能,降低响应时间;部署准备介绍了账号注册与充值步骤;一键部署详细讲解了创建 ECS、RDS 和 Redis 实例的过程;最后,通过对比测试验证了 Redis 缓存的有效性,并指导用户清理资源以避免额外费用。
Redis经典问题:缓存穿透
本文详细探讨了分布式系统和缓存应用中的经典问题——缓存穿透。缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致大量请求直接落到数据库上,可能引发数据库崩溃或性能下降。文章介绍了几种有效的解决方案,包括接口层增加校验、缓存空值、使用布隆过滤器、优化数据库查询以及加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统的影响,提升系统的稳定性和性能。
|
2月前
|
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
60 5
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
96 6
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构

热门文章

最新文章