Redis 缓存淘汰策略(上)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 本文主要讲解了 redis 缓存过期淘汰策略, 后面我们会结合 LeetCode 的 LRU 算法题目,自己动手实现 LRU 的算法案例(LRU 算法实践)。

常见的问题



1、生产上你们的 redis 设置的内存多少?


2、如果配置、修改 redis 内存的大小?


3、如果内存满了你怎么办?


4、redis 清理内存的方式?定期删除和惰性删除了解过吗?


5、redis 缓存淘汰策略


6、redis 的 lru 了解过吗?是否可以手写一个 lru 算法?


redis 内存满了怎么办?



redis 默认内存多少? 在哪里查看?如何设置和修改?


1、查看 redis 最大占用内存?


image.png


2、redis 默认内存多少可以用?


如果不设置最大内存大小或者设置对打内存大小 0 , 在 64 位操作系统下不限制内存大小,在 32位操作系统下最多使用 3G 内存


3、一般生产上你如何配置?


一般推荐 reids 设置内存为最大物理内存的 3/4


4、如何修改 redis 内存设置?


通过修改文件配置


image.png

通过命令修改


image.png


5、什么命令查看 redis 内存使用情况?


info memory


image.png


如果要是 redis 的内存满会怎么样?如果redis 内存使用超过了最大设置会怎么样?


1、如果要是 redis 的内存满会怎么样?如果redis 内存使用超过了最大设置会怎么样?


image.png


如果 redis 内存被打满了,会提示 “(error) OOM command not allowed when used memory > 'maxmemory'.”


结论


  • 设置了 maxmemory 的选项,加入 redis 内存使用达到了上限


  • 没有加上过期时间就会导致数据写满 maxmemory 为了避免这个问题,下面我们将在内存淘汰策略中详细阐述


redis 缓存淘汰策略?



1、往 redis 里面写了数据但是为什么会没了?

redis 过期键的删除策略


  • 如果一个键是过期的,那它到了过期时间之后是不是马上就从内存中被删除了呢?


  • 肯定不是


  • 如果不是,那过期之后到底什么时候被删除?? 是一个什么操作


三种不同的删除策略


1、定时删除


Redis 不可能时时刻刻遍历所有被设置了生存时间的key, 来检查数据是否已经到达过期时间,然后对他进行删除。


立即删除能把整内存中数据最大的新鲜度,因为它保证过期键值会在过期后马上被删除,其所占的内存也会随之释放,但是立即删除对 CPU 是最不友好的。因为删除操作会占用 CPU 的时间,如果刚好碰到 CPU 很忙的时候,比如正在做交集或者排序等计算的时候,这个时候会给 CPU 造成额外的压力,让 CPU 心累,有时候需要删除。忙死。。。。


这个时候会产生大量的性能消耗,同时也会影响数据的读取操作。


总结:对 CPU 不友好,用处理器吸能换存储空间(拿时间换空间)。



2、惰性删除


数据到达过期时间,不做处理,等下次访问该数据时,


如果未过期,返回数据:


发现已过期,删除,返回不存在


惰性删除策略的缺点是,它对内存最不友好的。


如果一个键已经过期,而这个键仍保留在数据库中, 那么只要这个过期键不被删除,它所占用的内存就不会释放。


在使用惰性删除策略时,如果数据库有非常多的过期键,而这这些过期键恰好🈶️没有被访问的话,那么他们也许永远不会被删除(除非用户手动执行 flushdb), 我们甚至可以将这种情况看作是一种内存泄漏 - 无用的垃圾数据占用了大量的内存,而服务器却不会自己去释放他们,这对于运行状态非常依赖与内存的 Redis 服务器来说,肯定不是一个好消息。


总结:对 memory 不友好,用存储空间换处理器性能(拿空间换时间)


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2天前
|
缓存 NoSQL 安全
Redis经典问题:缓存击穿
本文探讨了高并发系统中Redis缓存击穿的问题及其解决方案。缓存击穿指大量请求同一未缓存数据,导致数据库压力过大。为解决此问题,可以采取以下策略:1) 热点数据永不过期,启动时加载并定期异步刷新;2) 写操作加互斥锁,保证并发安全并设置查询失败返回默认值;3) 预期热点数据直接加缓存,系统启动时加载并设定合理过期时间;4) 手动操作热点数据上下线,通过界面控制缓存刷新。这些方法能有效增强系统稳定性和响应速度。
35 0
|
2天前
|
缓存 监控 中间件
中间件缓存失效策略
中间件缓存失效策略
5 2
|
2天前
|
缓存 中间件 数据库
中间件缓存策略类型
中间件缓存策略类型
6 2
|
2天前
|
缓存 NoSQL 应用服务中间件
Redis多级缓存
Redis多级缓存
8 0
|
2天前
|
缓存 NoSQL 关系型数据库
Redis 缓存 一致性
Redis 缓存 一致性
6 0
|
1月前
|
存储 NoSQL 算法
09- Redis分片集群中数据是怎么存储和读取的 ?
Redis分片集群使用哈希槽分区算法,包含16384个槽(0-16383)。数据存储时,通过CRC16算法对key计算并模16383,确定槽位,进而分配至对应节点。读取时,根据槽位找到相应节点直接操作。
66 12
|
1月前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
368 0
|
2天前
|
存储 监控 NoSQL
Redis哨兵&分片集群
Redis哨兵&分片集群
7 0
|
3天前
|
NoSQL 算法 Java
深入浅出Redis(八):Redis的集群模式
深入浅出Redis(八):Redis的集群模式