redis mget命令原理浅析

如题所述

第1个回答  2022-06-01
Mget 命令将n个get请求汇聚成一条命令,n个get请求需要和服务器交互n次,也就意味着n次网络trip,以及n次请求协议解析,将n个get请求汇聚成一个mget请求,与服务器只交互一次,大大降低网络、协议解析的开销,从而大幅提升缓存访问效率。

由于在集群模式下,mget获取的多个key,可能存在于多个分片,所以集群下的mget需要和多个分片做交互,衍生出多种方案

2.1. 传统的串行IO操作,也就说n个key,分n次串行操作来获取key,复杂度是o(n)。

2.2. 将Mget操作(n个key),利用已知的hash函数算出key对应的分片,这样就可以得到一个这样的关系:Map<node, somekeys>,也就是每个分片对应的一些keys,这样将之前的o(n)的效率降低到o(node.size())。

2.3. 在2.2方案的基础上将串行取数据改为并行取数据,进一步提高效率。

其中2.3方案效率最高,各类开源框架以及自研系统大多选用该方案。

3.1. 客户端分片集群模式,由客户端决定key写入或者读取的分片,jimdb实现了客户端分片机制,客户端存储集群分片信息,mget采用2.3方案拆分请求,客户端与集群分片直接并行交互,性能非常高,拆分请求、并行请求、聚合结果三个阶段都在客户端进行,所以集群服务端相对压力并不大,所以性能平稳,但客户端集群分片信息的管理以及同步复杂,开发难度大。

3.2. 基于代理的分片集群模式,客户端发送请求到一个代理,代理解析客户端的数据,将请求转发至正确的分片,然后将结果回复给客户端;客户端发送mget到proxy,由proxy进行mget请求的拆分、请求以及结果聚合,proxy资源充足情况下,表现良好,资源不足,性能会大大折扣,由于proxy多一次转发,性能也有所损耗,但对集群分片的管理,对客户端透明,也更加友好。

3.3. 路由查询集群模式,将请求发送到任意分片,接收到请求的分片会将查询请求发送到正确的分片上执行,Redis-cluster使用该模式,很遗憾,4.0 仅支持相同slot,key不能保证在相同slot还是没用。

https://www.jianshu.com/p/22aa8efaec8f
https://www.cnblogs.com/kaleidoscope/p/9630316.html l
https://www.jianshu.com/p/172b39244c85
https://www.cnblogs.com/wuwuyong/p/11774679.html
https://www.cnblogs.com/renpingsheng/p/9862485.html
https://blog.csdn.net/antony9118/article/details/75293115
相似回答