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

本文涉及的产品
云数据库 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
相关文章
|
9天前
|
NoSQL Redis
05- Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略:挥发性 LRU、LFU 和 TTL(针对有过期时间的数据),挥发性随机淘汰,以及全库的 LRU、LFU 随机淘汰,用于在内存不足时选择删除。另外,还有不淘汰策略(no-eviction),允许新写入操作报错而非删除数据。
11 1
|
16天前
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
|
3天前
|
缓存 NoSQL Java
使用Redis进行Java缓存策略设计
【4月更文挑战第16天】在高并发Java应用中,Redis作为缓存中间件提升性能。本文探讨如何使用Redis设计缓存策略。Redis是开源内存数据结构存储系统,支持多种数据结构。Java中常用Redis客户端有Jedis和Lettuce。缓存设计遵循一致性、失效、雪崩、穿透和预热原则。常见缓存模式包括Cache-Aside、Read-Through、Write-Through和Write-Behind。示例展示了使用Jedis实现Cache-Aside模式。优化策略包括分布式锁、缓存预热、随机过期时间、限流和降级,以应对缓存挑战。
|
7天前
|
存储 缓存 自动驾驶
缓存策略与Apollo:优化网络请求性能
缓存策略与Apollo:优化网络请求性能
|
10天前
|
NoSQL 安全 Redis
redis内存限制与淘汰策略
Redis内存管理包括限制和淘汰策略。`maxmemory`配置参数决定内存上限,无设置时64位系统默认不限制,可能导致系统资源耗尽,生产环境建议设定合理值。当内存满时,未设置淘汰策略会导致写入错误。Redis提供8种淘汰策略,如LRU(最近最少使用)和LFU(最不经常使用),以及随机或基于过期时间的删除。需根据数据重要性、访问频率和一致性选择合适策略。
13 0
|
10天前
|
存储 缓存 iOS开发
基于iOS的高效图片缓存策略实现
【4月更文挑战第9天】在移动应用开发中,图片资源的加载与缓存是影响用户体验的重要因素之一。特别是对于iOS平台,合理设计图片缓存策略不仅能够提升用户浏览图片时的流畅度,还能有效降低应用程序的内存压力。本文将介绍一种针对iOS环境优化的图片缓存技术,该技术通过多级缓存机制和内存管理策略,实现了图片快速加载与低内存消耗的目标。我们将从系统架构、关键技术细节以及性能评估等方面展开讨论,为开发者提供一套实用的图片缓存解决方案。
15 0
|
10天前
|
缓存 NoSQL Java
面试官:Redis如何实现延迟任务?
延迟任务是计划任务,用于在未来特定时间执行。常见应用场景包括定时通知、异步处理、缓存管理、计划任务、订单处理、重试机制、提醒和数据采集。Redis虽无内置延迟任务功能,但可通过过期键通知、ZSet或Redisson实现。然而,这种方法精度有限,稳定性较差,适合轻量级需求。Redisson的RDelayedQueue提供更简单的延迟队列实现。
47 9
|
11天前
|
缓存 NoSQL 定位技术
深入探索Redis:面试中必须掌握的关键知识点
深入探索Redis:面试中必须掌握的关键知识点
|
12天前
|
存储 缓存 NoSQL
Java手撸一个缓存类似Redis
`LocalExpiringCache`是Java实现的一个本地缓存类,使用ConcurrentHashMap存储键值对,并通过ScheduledExecutorService定时清理过期的缓存项。类中包含`put`、`get`、`remove`等方法操作缓存,并有`clearCache`方法来清除过期的缓存条目。初始化时,会注册一个定时任务,每500毫秒检查并清理一次过期缓存。单例模式确保了类的唯一实例。
11 0
|
17天前
|
NoSQL Java 测试技术
面试官:如何搭建Redis集群?
**Redis Cluster** 是从 Redis 3.0 开始引入的集群解决方案,它分散数据以减少对单个主节点的依赖,提升读写性能。16384 个槽位分配给节点,客户端通过槽位信息直接路由请求。集群是无代理、去中心化的,多数命令直接由节点处理,保持高性能。通过 `create-cluster` 工具快速搭建集群,但适用于测试环境。在生产环境,需手动配置文件,启动节点,然后使用 `redis-cli --cluster create` 分配槽位和从节点。集群动态添加删除节点、数据重新分片及故障转移涉及复杂操作,包括主从切换和槽位迁移。
30 0
面试官:如何搭建Redis集群?

热门文章

最新文章