Redis集群Proxy支持select命令方案介绍

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 目前Redis集群开源的方案主要有Redis Cluster,Codis,Twemproxy等,这几个方案里面都不支持select命令,即用户无法使用select进行逻辑db的切换,这样会给之前使用Redis单机的用户带来一定困扰,导致很多用户在迁移到集群方案的时候需要改造代码,本文探讨Redis集群支持select命令的方案实现。

目前Redis集群开源的方案主要有Redis Cluster,Codis,Twemproxy等,这几个方案里面都不支持select命令,即用户无法使用select进行逻辑db的切换,这样会给之前使用Redis单机的用户带来一定困扰,导致很多用户在迁移到集群方案的时候需要改造代码,本文探讨Redis集群支持select命令的方案实现。

阿里云Redis集群

阿里云的redis集群版由3大组件构成:

  • redis-config : 集群管理工具
  • redis-server : 优化过源码的redis,支持slot, 扩容迁移等
  • redis-proxy : 单线程,c++14语言实现的内核

数据链路图如下所示,用户的请求通过Proxy负载均衡之后分发到后端多个节点进行请求。
screenshot.png

Proxy介绍

Redis通常作为缓存,用户在访问Redis的时候都希望延迟尽量低,所以我们选择了C++进行开发,另外为了使用更多C++的新特性,我们选择了C++14进行开发,大量精简了代码提高了代码可阅读性。为了简化模型Proxy设计成单进程单线程的结构,所有用户请求都只会在一个工作线程上进行转发。另外为了保证云资源之间的隔离性,每个用户都具有独立的Proxy避免不同用户之间的互相影响。同时Proxy提供了HTTP的接口用于管控系统的控制和查询。阿里云Redis集群Proxy特性如下:

  • 支持单slot命令,支持set,get等单key命令
  • 支持多key命令,支持mset,mget等分布在不同db进行请求的命令
  • 支持pubsub订阅命令
  • 支持相同slot上的事物
  • 支持select命令
  • 热升级,链接不断开
  • 高性能
  • 低延时

从以上特性我们可以看到阿里云Redis的Proxy支持了绝大部分的Redis的命令,具有很高的兼容性。后续阿里云Redis集群Proxy还会提供block类命令支持,读写分离等特性。

Proxy如何支持select命令

方案1:一对一链接

screenshot.png
简单的方案如上图Proxy可以维护和客户端一对一的链接,对于所有客户端的请求建立一对一的链接,所有请求都直接进行转发到后端处理。这样的方案可以直接实现select命令的支持,但是这样的方案带来的问题就是需要频繁和后端Redis建立链接,性能比较差,而且在用户使用短连接的情况下还会造成链接风暴导致链路不稳定。

方案2:长连接

screenshot.png
方案二Proxy和后端Redis之间维护一个长连接,所有的命令都通过该长连接进行转发,Proxy需要维护每个前端Client的db信息,在转发命令的时候显示的增加select调用。这个方案如果在前端Client使用不同db的时候会导致后端db链接频繁进行db的切换,而且qps放大的倍数直接和client链接数目相关,会极大的影响集群的性能。

方案3:db级别长连接

screenshot.png
如上图Proxy到Redis之间每个db都维护一个长连接,每个长连接建立的时候都会执行select命令标注该链接为某个db的链接。用户执行select命令之后我们就标记该链接为对应的db,Proxy在接收到用户请求之后根据链接db信息转发到后端对应的长连接上,如果没有存在的长连接则新建一个对应的db长连接。考虑到原生的Redis支持的db数目为16个db,在后端Redis节点数目不多的情况下,Proxy支撑的连接数是有限的。这种方案可以降低Proxy的链接数目,同时可以让命令在相同链接上合并发送提高Proxy到Redis的性能。

总结

阿里云Redis采用了上述方案3来实现select多命令的支持,在实际过程中由于Proxy还需要支持事物、订阅等命令,实际的链接模型会比上面的还复杂,后续我们也会继续介绍事物、订阅等命令如何实现。阿里云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
目录
相关文章
|
4天前
|
存储 缓存 监控
Redis设计与实现——Redis命令参考与高级特性
Redis 是一个高性能的键值存储系统,支持丰富的数据类型(字符串、列表、哈希、集合等)和多种高级功能。本文档涵盖 Redis 的核心命令分类,包括数据类型操作、事务与脚本、持久化、集群管理、系统监控等。特别介绍了事务的原子性特性、Lua 脚本的执行方式及优势、排序机制、发布订阅模型以及慢查询日志和监视器工具的使用方法。适用于开发者快速掌握 Redis 常用命令及其应用场景,优化系统性能与可靠性。
|
1月前
|
存储 NoSQL 数据库
Redis 逻辑数据库与集群模式详解
Redis 是高性能内存键值数据库,广泛用于缓存与实时数据处理。本文深入解析 Redis 逻辑数据库与集群模式:逻辑数据库提供16个独立存储空间,适合小规模隔离;集群模式通过分布式架构支持高并发和大数据量,但仅支持 database 0。文章对比两者特性,讲解配置与实践注意事项,并探讨持久化及性能优化策略,助你根据需求选择最佳方案。
71 5
|
6天前
|
存储 缓存 NoSQL
Redis中的常用命令-get&set&keys&exists&expire&ttl&type的详细解析
总的来说,这些Redis命令提供了处理存储在内存中的键值对的便捷方式。通过理解和运用它们,你可以更有效地在Redis中操作数据,使其更好地服务于你的应用。
116 17
|
8天前
|
消息中间件 NoSQL Linux
Redis的基本介绍和安装方式(包括Linux和Windows版本),以及常用命令的演示
Redis(Remote Dictionary Server)是一个高性能的开源键值存储数据库。它支持字符串、列表、散列、集合等多种数据类型,具有持久化、发布/订阅等高级功能。由于其出色的性能和广泛的使用场景,Redis在应用程序中常作为高速缓存、消息队列等用途。
98 16
|
10天前
|
JSON NoSQL Redis
在Rocky9系统上安装并使用redis-dump和redis-load命令的指南
以上步骤是在Rocky9上使用redis-dump和redis-load命令顺利出行的秘籍。如果在实行的过程中,发现了新的冒险和挑战,那么就像一个勇敢的航海家,本着探索未知的决心,解决问题并前进。
42 14
|
8天前
|
消息中间件 NoSQL Unix
Redis的基本特性以及其基础命令用法
这只是冰山一角,Redis的强大功能和简洁的操作方法值得我们深入了解和掌握,是复杂数据问题解决的有力工具。所以,来一场有趣的Redis冒险吧!
54 6
|
1月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
2月前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用的算法是哈希槽分区算法。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作
|
5天前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
58 31
|
15天前
|
缓存 NoSQL Java
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
35 5
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡

相关产品

  • 云数据库 Tair(兼容 Redis)