Redis混合存储产品与架构介绍

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
简介: 简介 Redis混合存储实例是阿里云自主研发的完全兼容Redis协议和特性的混合存储产品。通过将部分冷数据存储到磁盘,在保证绝大部分访问性能不下降的基础上,大大降低了用户成本并突破了内存对Redis单实例数据量的限制。

简介

Redis混合存储实例是阿里云自主研发的完全兼容Redis协议和特性的混合存储产品。通过将部分冷数据存储到磁盘,在保证绝大部分访问性能不下降的基础上,大大降低了用户成本并突破了内存对Redis单实例数据量的限制。
目前阿里云Redis混合存储产品在华北2(北京)可用区D,华东1(杭州)可用区E,华南1(深圳)可用区C已开放售卖,相关产品介绍详见https://promotion.aliyun.com/ntms/act/hybridstore.html

与Redis高性能内存型实例差别

Redis高性能内存型实例中,所有的Key和Value都存储在内存中以达到极致性能。
Redis混合存储型实例中,所有的Key和经常访问的Value会被保存在内存中,保证绝大部分请求的极致性能。不常访问的Value(冷数据)则会被存储到磁盘上,以达到内存利用最高性价比。

产品优势

  1. 简单易用
    完全兼容Redis协议,用户无需修改任何代码。
  2. 低成本
    相同数据量下,NVMe盘成本仅为内存的1/10。
  3. 大容量
    突破内存容量限制,单实例最高可支持TB级别的数据容量。
  4. 高性能
    Redis混合存储型实例的绝大部分热点请求直接从内存获取,其性能与高性能内存型实例完全一致。后台异步IO,冷数据访问不影响正常请求的响应。在90%数据落在磁盘上的极端场景下,正态访问的QPS仍可达纯内存性的70%。底层存储采用阿里自研下一代高性能全用户态存储引擎Alibaba FusionEngine:通过结合上层应用深入定制,以及与底层硬件深度结合,将新一代存储介质如NVMe SSD性能发挥到极致。4KB数据读取速度在20us左右,相比业界同类引擎性能有80%提升。

整体架构

image

存储模型

image
在Redis混合存储实例中,我们将所有的Key和经常访问的Value保留在内存中,将不经常访问的Value保存在磁盘上。之所以在内存中保留所有Key是处于以下两点考虑:

  1. Key的访问频度比Value要高很多。
    作为KV数据库,通常的访问请求都需要先查找Key确认Key是否存在,而要确认一个key不存在,就需要以某种形式检查所有Key的集合。在内存中保留所有Key,可以保证key的查找速度与纯内存版完全一致。
  2. Key的大小占比很低。
    在通常的业务模型里面,即使是普通字符串类型,Value比Key要大几倍。而对于Set,List,Hash等集合对象,所有成员加起来组成的Value更是比Key大了好几个数量级。

Redis混合存储实例将所有的Key都认为是热数据,以少量的内存为代价保证所有Key的访问请求的性能是高效且一致的。而对于Value部分,Redis混合存储实例会在必要时根据最近访问时间,访问频度,Value本身大小等维度选取出一部分Value作为冷数据后台异步存储到磁盘上。

因此,Redis混合存储实例最适合以下使用场景:

  1. 数据访问不均匀,存在热点数据;
  2. 内存不足以放下所有数据,且Value较大(相对于Key而言)

线程模型

image
Redis混合存储实例采用单工作线程的模式,主线程为工作线程,负责处理用户请求等主要逻辑。此外,Redis混合存储实例中根据需要会配置若干个独立的IO线程负责与磁盘进行交互读写数据,IO线程读写数据时,主线程仍可继续响应其它用户请求。

数据从内存到磁盘

  1. 在周期巡检函数serverCron中,如果发现当前内存快满了,大于设定的阈值vm-max-memory(略小于maxmemory)时,会尝试挑选出一些key,将其Value保存到磁盘;
  2. 挑选的维度为最近访问时间和value大小, 公式为swappability = age*log(估算内存大小)。
  3. 主线程为挑选出的value生成IO任务,加入到IO任务队列中;
  4. IO线程会从IO任务队列中取出任务,将Value存储到底层存储引擎(RocksDB)中, 并通知主线程。
  5. 主线程收到通知后释放Value所占用内存并标记内存中该Key对应的Value已被存储到磁盘上。

数据从磁盘到内存

  1. 当Redis混合存储实例收到用户请求时,会先判断请求是否需要读取对应Key的Value;
  2. 如果请求不需要读取相关value(比如set foo bar是不需要关心foo这个key原有的值是多少的)或者value已经在内存中,则正常执行该命令;
  3. 如果有涉及到的Value不在内存中,主线程会对应生成一个读取Value的IO任务,加入到IO任务队列中;
  4. 主线程将需要等待IO任务完成的客户端加入到等待列表,然后继续处理其余客户端的请求;
  5. IO线程获取到读取Value的IO任务时,从底层存储引擎中读取数据,并通知主线程;
  6. 主线程收到通知后,依次处理等待该Value的所有客户端请求。

同步IO

在以下情况下,Redis混合存储的异步IO模型会退化成同步方式:

  1. 写入量太大导致后台线程不能及时将数据交换到磁盘,内存不断增加到超出maxmemory时。
  2. 由于无法预知脚本会操作哪些value以及原子性的要求,lua脚本中涉及到的value如果在磁盘上的话将会采用同步IO的方式从磁盘读取。

数据淘汰机制

在 Redis 中,允许用户设置最大使用内存大小 server.maxmemory,在内存限定的情况下是很有用的。Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。Redis 提供 6 种数据淘汰策略:

  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  • no-enviction(驱逐):禁止驱逐数据

Redis混合存储实例的淘汰策略与纯内存版完全一致,唯一不同的是触发条件。在混合存储实例中,除了内存规格大小server.maxmemory外,还有一个数据磁盘大小的限制server.maxdisksize。触发数据淘汰的条件响应的变为以下两者之一:

  1. 使用内存 > server.maxmemory 且 磁盘数据 > server.maxdisksize。
  2. 使用内存 > server.maxmemory, 且当前内存中无Value(全部为Key)。

持久化

Redis有两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件):

RDB持久化方式会在一个特定的间隔保存那个时间点的一个数据快照。
AOF持久化方式则会记录每一个服务器收到的写操作。在服务启动时,这些记录的操作会逐条执行从而重建出原来的数据。写操作命令记录的格式跟Redis协议一致,以追加的方式进行保存。

Redis混合存储实例在RDB+AOF基础之上,采用了RocksDB的Checkpoint保存当前实例冷数据的部分。 在生成数据快照时,RDB中仅存储Key + 热数据部分,而冷数据部分则保存在RocksDB的Checkpoint中。RocksDB checkpoint生成过程如下:

  • 禁止删除SST文件;
  • 为SST文件创立硬链接;
  • 备份manifest等文件;
  • 允许删除SST文件;
    由于冷数据在RocksDB中的大部分是以SST文件形式存在的,使用硬链接的方式备份几乎不需要消耗额外的时间。通过使用RDB+CheckPoint的方式存储快照,Redis混合存储实例可以有效的降低数据快照生成和加载的时间,避免了过程中冷数据数据在RDB, 内存,RocksDB之间的来回转换。

底层存储引擎

Amber_001_jpeg
Redis混合存储实例通过精心定义的编码转换层最小化IO SIZE,定制调优的RocksDB最大化读写性能,阿里自研下一代高性能全用户态存储引擎压榨硬件性能以及搭配最新的硬件,将IO速度提升到极致。
底层存储采用阿里自研下一代高性能全用户态存储引擎Alibaba FusionEngine:通过结合上层应用深入定制,以及与底层硬件深度结合,将新一代存储介质如NVMe SSD性能发挥到极致。4KB数据读取速度在20us左右,相比业界同类引擎性能有80%提升。

性能数据

在线上机器上,我们使用memtier_benchmark测试了Redis纯内存高性能实例和Redis混合存储实例的性能对比如下(Value大小为1024字节):
image

  1. 当访问内存中数据时,Redis混合存储实例的性能与Redis纯内存高性能实例几乎一致;
  2. 当内存仅能容纳10%的value数据时,正态访问(70%的访问落在33%的数据范围内)时,Redis混合存储实例的性能为Redis纯内存高性能实例的70%左右。

产品详情

https://promotion.aliyun.com/ntms/act/hybridstore.html

目录
相关文章
|
3月前
|
前端开发 JavaScript 关系型数据库
如何开发生产小工单中的产品管理板块(附架构图+流程图+代码参考)
生产小工单中的产品管理板块是制造业数字化管理的关键环节,涵盖产品信息、生产工序、产品列表和基础设置四大功能模块。通过系统化管理,企业可实现对产品属性、工艺流程及资源配置的精准控制,提升生产效率并减少误差与浪费。本文详解了各功能模块的设计逻辑、业务流程及开发实现方案,并提供示例代码,助力企业构建高效、灵活的产品管理系统。
|
4月前
|
存储 机器学习/深度学习 缓存
软考软件评测师——计算机组成与体系结构(分级存储架构)
本内容全面解析了计算机存储系统的四大核心领域:虚拟存储技术、局部性原理、分级存储体系架构及存储器类型。虚拟存储通过软硬件协同扩展内存,支持动态加载与地址转换;局部性原理揭示程序运行特性,指导缓存设计优化;分级存储架构从寄存器到外存逐级扩展,平衡速度、容量与成本;存储器类型按寻址和访问方式分类,并介绍新型存储技术。最后探讨了存储系统未来优化趋势,如异构集成、智能预取和近存储计算等,为突破性能瓶颈提供了新方向。
|
8天前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
17天前
|
Java API 开发工具
灵码产品演示:软件工程架构分析
本演示展示灵码对复杂软件项目的架构分析与文档生成能力。通过Qwen3模型,结合PlantUML,自动生成系统架构图、微服务时序图,并提取API接口文档,实现高效、智能的代码理解与文档输出。
101 5
|
2月前
|
存储 NoSQL 算法
Redis的集群架构与使用经验
本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
|
3月前
|
前端开发 NoSQL 关系型数据库
如何开发CRM系统中的产品管理板块(附架构图+流程图+代码参考)
本文深入解析了CRM系统中产品管理模块的设计与实现,涵盖系统架构、业务流程、核心代码及落地建议,助力企业构建高效的产品管理体系。
|
3月前
|
人工智能 自然语言处理 供应链
AI时代企业难以明确大模型价值,AI产品经理如何绘制一张‘看得懂、讲得通、落得下’的AI产品架构图解决这一问题?
本文产品专家系统阐述了AI产品经理如何绘制高效实用的AI产品架构图。从明确企业六大职能切入,通过三层架构设计实现技术到业务的精准转译。重点解析了各职能模块的AI应用场景、通用场景及核心底层能力,并强调建立"需求-反馈"闭环机制。AI产品专家三桥君为AI产品经理提供了将大模型能力转化为商业价值的系统方法论,助力企业实现AI技术的业务落地与价值最大化。
173 0
|
4月前
|
存储 关系型数据库 MySQL
成本直降30%!RDS MySQL存储自动分层实战:OSS冷热分离架构设计指南
在日均订单量超500万的场景下,MySQL数据年增200%,但访问集中在近7天(85%)。通过冷热数据分离,将历史数据迁移至OSS,实现存储成本下降48%,年省72万元。结合RDS、OSS与Redis构建分层架构,自动化管理数据生命周期,优化查询性能与资源利用率,支撑PB级数据扩展。
232 3
|
4月前
|
存储 关系型数据库 数据库
高性能云盘:一文解析RDS数据库存储架构升级
性能、成本、弹性,是客户实际使用数据库过程中关注的三个重要方面。RDS业界率先推出的高性能云盘(原通用云盘),是PaaS层和IaaS层的深度融合的技术最佳实践,通过使用不同的存储介质,为客户提供同时满足低成本、低延迟、高持久性的体验。
|
5月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?

相关产品

  • 云数据库 Tair(兼容 Redis)