深入浅出Redis(三):Redis数据的存储、删除以及淘汰

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 深入浅出Redis(三):Redis数据的存储、删除以及淘汰

引言

Redis是一款基于键值对的数据结构存储系统,它的特点是基于内存操作、单线程处理命令、IO多路复用模型处理网络请求、键值对存储与简单丰富的数据结构等等

本篇文章不像以往文章围绕Redis某个特点来讲解,而是作为过渡介绍,来说一说Redis是如何存储数据、如何删除数据和如何淘汰数据

存储数据

使用dict字典对Key、Value进行存储,Key总是字符串对象,Value可以是其他对象

键对象可以被设置过期时间,需要注意的是只能对键对象设置过期时间,不能对值对象设置过期时间,如果键对应的值对象为集合类型过期时间到达,集合内的所有元素都过期

image.png

使用expires字典存储 键以及键对应的过期时间戳,Key为键对象地址(复用),Value为到期时间的毫秒时间戳

删除数据

当Redis中的数据发生过期时,不一定立马去删除,而是根据不同的删除策略有不同的删除时机

删除策略有三种分别是:定时删除、惰性删除、定期删除

定时删除使用计时器,到达过期时间就立马去删除数据;如果当前CPU比较忙,还要去删除比较大的数据时就可能发生阻塞,影响用户,但是带来的好处是过期数据立马被删除,不会占用空间,是一种时间换空间的删除策略

惰性删除当数据过期时不会立马删除,而是读写命令操作数据前检查这个键Key是否过期,如果过期就顺便删除;当数据过期并不立即删除,等到后续操作数据时先检查再删除,期间数据占用空间但无作用,如果不再操作数据可能导致数据永久不删除,是一种空间换时间的删除策略

定期删除是每秒使用可指定的固定的CPU资源遍历库并随机挑选库中过期字典上的多个Key检查是否过期,过期则删除;如果过期比例较大则还会再该库中进行随机挑选,否则去下一个库中随机挑选检查删除可指定使用CPU资源不影响用户,也不会存在内存泄漏,是一种折中方案

Redis中默认使用惰性删除和定期删除的策略,使用空间换时间的方式不引起阻塞,惰性删除中不操作过期数据的场景还是较小的,即使不操作过期数据还有定期删除兜底随机删除数据,最终不会引发内存泄漏

淘汰数据

当数据快占满空间时,会使用淘汰策略来将数据淘汰,否则空间占满会影响Redis的可用性

每次加入数据会先判断内存是否足够,当内存不足时,使用淘汰算法临时删除数据;如果删除一个数据空间还不够会多次使用淘汰算法,直到满足此次操作需要的空间,如果选择的淘汰算法是不临时删除数据,就直接抛出OOM错误(默认)

可以在配置文件中配置淘汰策略算法

# 最大配置内存容量
 maxmemory 2g
 # 使用逐出算法时要删除数据个数(过小会多次执行逐出算法,过大会阻塞很久)
 maxmemory-samples 
 maxmemory-policy noeviction #逐出算法的策略
 #noeviction 永不过期,返回错误
 
 #volatile-lfu 挑选expires区数据用lfu算法淘汰
 #volatile-lru 挑选expires区的数据使用LRU淘汰
 #volatile-random 挑选expires区的数据随机淘汰
 #volatile-ttl 挑选expires区要过期的数据淘汰
 
 #allkeys-random:挑选全局数据随机删除
 #allkeys-lfu 挑选全局数据用lfu算法淘汰
 #allkeys-lru 挑选全局数据用lru算法淘汰

淘汰策略前缀使用volatile表示在expires字典中选择数据删除,前缀使用allkeys表示在全局下选择数据删除

大部分场景下,使用淘汰策略时应该优先保留命中率高的数据,而临时删除命中率较低的数据

LFU算法是淘汰最近最少使用次数的数据,期间需要记录数据被使用的次数

LRU算法是淘汰最近最久未使用的数据,常用队列维护,使用到数据就将数据放到队头,队尾数据就是最近最久未使用的数据(要淘汰的数据)

总结

本篇文章讲解了Redis如何存储数据、删除数据、淘汰数据

使用dict字典存储键值对象,键对象一定为字符串对象,而值对象可以是其他任意类型对象

使用expires字典存储键对象过期时间,Key为键对象地址(复用),Value为到期时间的毫秒时间戳

定时删除使用计时器删除数据,时间换空间的策略,可能导致用户线程阻塞

惰性删除每次操作Key前检查是否过期,过期则删除,空间换时间的策略,可能导致内存泄漏

定期删除使用固定CPU资源遍历随机挑选删除,是一种折中策略,默认情况下惰性删除与定期删除搭配使用

如果添加数据内存不足,会使用淘汰策略来临时删除数据,默认情况下直接报错OOM,在大部分场景下可以选择LRU算法,避免将命中率高的数据临时删除

最后

  • 参考资料
  • 《Redis深度历险》
  • 《Redis设计与实现》


相关实践学习
基于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
相关文章
|
5天前
|
存储 监控 负载均衡
保证Redis的高可用性是一个涉及多个层面的任务,主要包括数据持久化、复制与故障转移、集群化部署等方面
【5月更文挑战第15天】保证Redis高可用性涉及数据持久化、复制与故障转移、集群化及优化策略。RDB和AOF是数据持久化方法,哨兵模式确保故障自动恢复。Redis Cluster实现分布式部署,提高负载均衡和容错性。其他措施包括身份认证、多线程、数据压缩和监控报警,以增强安全性和稳定性。通过综合配置与监控,可确保Redis服务的高效、可靠运行。
27 2
|
5天前
|
存储 监控 NoSQL
Redis处理大量数据主要依赖于其内存存储结构、高效的数据结构和算法,以及一系列的优化策略
【5月更文挑战第15天】Redis处理大量数据依赖内存存储、高效数据结构和优化策略。选择合适的数据结构、利用批量操作减少网络开销、控制批量大小、使用Redis Cluster进行分布式存储、优化内存使用及监控调优是关键。通过这些方法,Redis能有效处理大量数据并保持高性能。
23 0
|
5天前
|
存储 NoSQL 关系型数据库
【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
15 0
|
5天前
|
NoSQL Redis 数据库
Redis实现数据持久性主要依赖两种机制
【5月更文挑战第15天】Redis持久化包括RDB快照和AOF日志。RDB通过定时内存数据快照生成文件,恢复速度快但可能丢失部分数据;AOF记录每次写操作,实时性好但文件大、恢复慢。混合持久化兼顾两者优点,提供数据安全与性能平衡。用户可按需选择或组合使用策略。
7 2
|
5天前
|
缓存 监控 NoSQL
Redis的主要内存淘汰策略
【5月更文挑战第15天】Redis内存淘汰策略在内存满时删除旧数据以容纳新数据。策略包括:volatile-lru/LFU/random(针对有过期时间的键),volatile-ttl(淘汰TTL最短的键),allkeys-lru/LFU(淘汰所有键),和allkeys-random。还有noeviction策略,不淘汰任何键,新写入会报错。选择策略应基于应用访问模式、数据重要性和性能需求。可以通过info命令监控缓存命中率调整策略。
15 3
|
5天前
|
NoSQL API Redis
Redis源码、面试指南(3)数据对象类型编码(下)
Redis源码、面试指南(3)数据对象类型编码
11 1
|
5天前
|
存储 NoSQL API
Redis源码、面试指南(3)数据对象类型编码(上)
Redis源码、面试指南(3)数据对象类型编码
17 2
|
5天前
|
缓存 NoSQL Redis
Redis经典问题:数据并发竞争
在大流量系统中,数据并发竞争可能导致系统性能下降和崩溃。为解决此问题,可以采取加写回操作和互斥锁,确保数据一致性并减少写操作对缓存的影响。另外,保持缓存数据多个备份能降低并发竞争概率。通过实例展示了如何在电商网站中应用这些策略,从而提高系统稳定性和性能。关注微信公众号“软件求生”获取更多技术分享。
233 1
|
5天前
|
缓存 监控 NoSQL
Redis经典问题:数据不一致
小米探讨了Redis数据不一致问题及其原因,包括缓存更新失败和rehash异常。提出了解决方案,如重试策略、缩短缓存时间、优化写入策略、监控报警、一致性验证、缓存分层和数据回滚机制。通过这些方法可提升应用的稳定性和性能。
217 2
|
5天前
|
存储 NoSQL 测试技术
Redis数据存储系统为什么快?
Redis的快速并非偶然,而是深思熟虑的设计理念的结果。通过将数据存储于内存、采用单线程模型、实现非阻塞I/O等独特的技术选择,Redis在高并发和低延迟方面展现了卓越的表现。
39 16