缓存杂谈(五) Redis的过期策略 及 LRU 算法

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis的过期策略 及 LRU 算法

Redis的过期策略能介绍一下嘛,能不能手写一个LRU算法

Redis中的数据失效方式

设置TTL(过期时间)

RedisTTL时间到了之后,Redis如何批量删除key以及Value

定期删除+惰性删除

定期删除:指的是Redis默认每隔100MS就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期了,就直接删除,注意,这个地方redis并不是每隔100ms就遍历所有的设置过期时间的key,而是抽取一部分key来检查和删除

但问题就是定期删除可能会导致很多过期key到了过期时间并没有被删除掉,所以需要惰性删除,就是说,当命中某个key的时候,Redis会检查一下这个Key如果设置了过期时间,那么这个key是否已经删除,如果过期了后,此时就会被删除

但是这样还有一个问题,如果一个key不仅逃离了定期删除而且还长时间key没有命中,长期积累下来的话会导致Redis内存耗尽,如何处理

走内存淘汰策略

内存淘汰

如果Redis的内存占用过多的时候,此时会进行内存淘汰,有如下一些策略:

  1. noevication:当内存不足以容纳新写入的数据时,新写入操作会报错,这个一般没人用,太恶心了
  2. allkeys-lru:当内存不足以容纳新写入的数据时,移除最近最少使用的key(这个是最常用的)
  3. allkeys-random:当内存不足以容纳新写入的数据的时候,在键空间中随机移除某个key,这个也没人用,随机移除简直要了命了
  4. valatile-lru: 当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,移除最少使用的key
  5. valtile-random:当内存不足以容纳新写入的数据的时候,在设置了过期时间的键空间中,随即移除某个key
  6. volatile-ttl:当内存不足一容纳写入新数据是,在设置了过期时间的键空间中,有更早过期时间的key优先移除
如何手写一个LRU算法
public class LRUCache<K,V> extends LinkedHashMap<K,V> {
   
    private final int CACHE_SIZE;
       //这里就是传递进来最多能缓存多少数据
    pubilc LRUCache(int cacheSize){
   
        super(Math.ceil(cacheSize/0.75) + 1, 0.75f, true);//这块就是设置一个hashMap的初始化大小,同时最后一个true指的是让likedhashMap按照访问顺序来进行排序,最近访问的放在头,最老访问的放在尾
        CACHE_SIZE=cacheSize;
    }

    protected boolean removeEldestEntry(Map.Entry eldest){
   
        return size() > CACHE_SIZE;//这个意思就是当Map中的数据量大于指定的缓存个数的时候,自动删除最好的数据
    }
}
相关实践学习
基于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
目录
相关文章
|
17天前
|
缓存 NoSQL 数据库
探秘Redis读写策略:CacheAside、读写穿透、异步写入
本文介绍了 Redis 的三种高可用性读写模式:CacheAside、Read/Write Through 和 Write Behind Caching。CacheAside 简单易用,但可能引发数据不一致;Read/Write Through 保证数据一致性,但性能可能受限于数据库;Write Behind Caching 提高写入性能,但有数据丢失风险。开发者应根据业务需求选择合适模式。
64 2
探秘Redis读写策略:CacheAside、读写穿透、异步写入
|
15天前
|
存储 NoSQL Redis
【Redis】Redis如何实现key的过期删除
【Redis】Redis如何实现key的过期删除
|
4天前
|
存储 NoSQL Java
熟悉Redis吗,那Redis的过期键删除策略是什么
对于Redis,我们业务开发一般都只关心Redis键值对的查询、修改操作,可能因为懒或者只想能用就行,呵呵。很少关心键值对存储在什么地方、键值对过期了会怎么样、Redis有没什么策略处理过期的键、Redis处理过期键又有什么作用?但这些问题却是Java程序员在Redis上进阶的必备知识,不要埋怨Java要学习的系统知识为什么这么多,因为这些确确实实是进阶的程序员所必须掌握的。我们往下看看~
25 2
熟悉Redis吗,那Redis的过期键删除策略是什么
|
6天前
|
缓存 算法
LRU(Least Recently Used)算法是一种常用的计算机缓存替换算法
LRU算法是基于页面使用频率的缓存策略,优先淘汰最近最久未使用的页面。实现可采用双向链表或数组,前者灵活,后者时间复杂度低。优点是利用时间局部性提高命中率,简单易实现;缺点是占用空间,对循环访问和随机访问场景适应性不佳。
23 0
|
7天前
|
缓存 监控 NoSQL
Redis缓存雪崩及应对策略
缓存雪崩是分布式系统中一个常见但危险的问题,可以通过合理的缓存策略和系统设计来降低发生的概率。采用多层次的缓存架构、缓存预热、合理的缓存失效时间等措施,都可以有效应对缓存雪崩,提高系统的稳定性和性能。在实际应用中,及时发现并解决潜在的缓存雪崩问题,是保障系统可用性的关键一环。
38 14
|
12天前
|
存储 缓存 算法
面试遇到算法题:实现LRU缓存
V哥的这个实现的关键在于维护一个双向链表,它可以帮助我们快速地访问、更新和删除最近最少使用的节点,同时使用哈希表来提供快速的查找能力。这样,我们就可以在 O(1) 的时间复杂度内完成所有的缓存操作。哈哈干净利索,回答完毕。
|
16天前
|
缓存 NoSQL 算法
【Redis系列笔记】内存淘汰及过期删除
Redis是一个内存键值对数据库,所以对于内存的管理尤为重要。Redis内部对于内存的管理主要包含两个方向,过期删除策略和数据淘汰策略。内存淘汰策略指在Redis内存使用达到一定阈值的时候,执行某种策略释放内存空间,以便于接收新的数据。数据过期删除策略是指在数据的有效时间到期后,如何从内存中删除这些数据的规则。
34 0
|
16天前
|
缓存 NoSQL Redis
揭秘Redis的高效失效策略,提升可用性
Redis是广泛使用的开源内存数据库,其高性能和多样性使其在现代应用中不可或缺。然而,内存限制和数据管理是关键挑战。本文探讨了Redis的失效策略,包括内存淘汰(如LRU和LFU)和缓存失效策略(定时清除、惰性清除和定时扫描清除),以应对内存耗尽、数据过期等问题,确保系统性能和稳定性。通过合理配置这些策略,可以优化内存使用,防止数据不一致,提升系统效率。
52 0
揭秘Redis的高效失效策略,提升可用性
|
16天前
|
存储 缓存 NoSQL
Redis入门到通关之Redis内存淘汰(内存过期)策略
Redis入门到通关之Redis内存淘汰(内存过期)策略
31 3
|
20天前
|
运维 监控 NoSQL