twemproxy在redis上能处理多命令流程只有mset,mget,del的命令,例如mset的话是mset k1 v1 k2 v2 k3 k3,mget的话是mget k1 k2 k3,del的话是del k1 k2 k3。twemproxy在memcache上能处理多命令流程只有get\gets命令,例如get的话是get k1 k2 k3

但是由于twemproxy是redis或memcahe协议的代理,在后端有多台redis或memcache,为此,所有的key/value对会分散在多台redis或memcahe上。在将多个key/value对加入到redis或memcache集群中,twemproxy需要将多个对应的key/value对分别通过将key计算后的hash值路由到对应的后端redis或memcache。而要在redis或memcache集群中查询对应的key/value时,twemproxy需要将对应的key/value对通过将key计算后的hash值从对应的后端redis或memcache收集过来拼接起来返回给用户。

如下图现在有两个后端redis或memcache,key1,key3在后端0上,key2在后端1上,twemproxy通过将收到的请求frag_owner进行分片分片成下面的两个分片将key1,key3发往后端0,key2发往后端1,分片的指针指向frag_owner。

key1  => backend 0
key2 => backend 1
key3 => backend 0
 it will fragment like this:

   +-----------------+
| msg vector |
|(original msg) |
|key1, key2, key3 |
+-----------------+ frag_owner
/--------------------------------------+
frag_owner / |
/-----------+ | /------------+ frag_owner |
| | | | | |
| v v v | |
+--------------------+ +---------------------+ +----+----------------+
| frag_id = 10 | | frag_id = 10 | | frag_id = 10 |
| nfrag = 3 | | nfrag = 0 | | nfrag = 0 |
| frag_seq = x x x | | key1, key3 | | key2 |
+------------|-|-|---+ +---------------------+ +---------------------+
| | | ^ ^ ^
| \ \ | | |
| \ ----------+ | |
+---\---------------+ |
------------------------------------------+
例如请求是mget key1 key2 key3,twemproxy会将命令切割成mget key1 key3mget key2,分别发往后端0,后端1。
同样的在,收到这些命令回复后,通过分片和请求之间的关系将其进行拼接后放回给用户。

twemproxy分片处理原理--剖析twemproxy代码正编的更多相关文章

  1. twemproxy发送流程探索——剖析twemproxy代码正编

    本文想要完成对twemproxy发送流程--msg_send的探索,对于twemproxy发送流程的数据结构已经在<twemproxy接收流程探索--剖析twemproxy代码正编>介绍过 ...

  2. twemproxy接收流程探索——剖析twemproxy代码正编

    本文旨在帮助大家探索出twemproxy接收流程的代码逻辑框架,有些具体的实现需要我们在未来抽空去探索或者大家自行探索.在这篇文章开始前,大家要做好一个小小的心理准备,由于twemproxy代码是一份 ...

  3. twemproxy代理主干流程——剖析twemproxy代码正编

    在twemproxy的发送和接收流程剖析中,我们已经完全弄清楚twemproxy如何将客户端以及服务端发来的包切分成msg,获得一个独立的msg后twemproxy应该如何处理?这是本文这次需要重点介 ...

  4. twemproxy代码框架概述——剖析twemproxy代码前编

    本篇将去探索twemproxy源码的主干流程,想来对于想要开始啃这份优秀源码生肉的童鞋会有不小的帮助.这里我们首先要找到 twemproxy正确的打开方式--twemproxy的文件结构,接着介绍tw ...

  5. 剖析twemproxy前言

    又是喜闻乐见的新坑,前面的mysql协议,当我在解读go-mysql包的时候,会重新讲到,至于Leetcode的更新会与go语言同步.关于这个redis的新坑,目前打算通过剖析twemproxy源码来 ...

  6. Redis+Twemproxy分片存储实现

    from unsplash 为提高Redis存储能力的提升,以及对外提供服务可用性提升,有时候有必要针对Redis进行集群式搭建,比较常用的有Twemproxy分片存储以及官方提供的Cluster方式 ...

  7. 推荐《深入浅出深度学习原理剖析与python实践》PDF+代码

    <深入浅出深度学习原理剖析与Python实践>介绍了深度学习相关的原理与应用,全书共分为三大部分,第一部分主要回顾了深度学习的发展历史,以及Theano的使用:第二部分详细讲解了与深度学习 ...

  8. ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)

    ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.Configure ...

  9. ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行

    ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行 核心框架 ASP.NET Core APP 创建与运行 总结 之前两篇文章简析.NET Core 以及与 .NET Framew ...

随机推荐

  1. (转)在server 2008R2组策略设置所有域计算机防火墙都处于更关闭状态

    组策略在域控中相当重要,我们可以下放一个组策略去统一管理下面客户端的配置,具体配置如下: 首先点击开始____管理工具____组策略管理 防火墙关闭完之后我们该如何到客户端验证呢? 首先我们需要现在客 ...

  2. Shiro的Filter机制详解---源码分析(转)

    Shiro的Filter机制详解 首先从spring-shiro.xml的filter配置说起,先回答两个问题: 1, 为什么相同url规则,后面定义的会覆盖前面定义的(执行的时候只执行最后一个). ...

  3. 如何在电脑上播放iso映像文件

    http://blog.sina.com.cn/s/blog_4a20485e0102e5ya.html

  4. CompletionService 和ExecutorService的区别和用法

    JavaSE5的Java.util.concurrent包中的执行器(Executor)将为你管理Thread对象,从而简化了并发编程.Executor在客户端和执行任务之间提供了一个间接层,Exec ...

  5. php 过滤js字符串代码

    $str = '<script type="text/javascript" src="dd.js"></script> 测试php正则 ...

  6. chrome-vimium在markdown插件的页面失去效果

    chrome-vimium在markdown插件的页面失去效果

  7. Docker入门之 - 更换源为国内源,实现快速下载image

    原文:Docker入门之 - 更换源为国内源,实现快速下载image 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012055638/artic ...

  8. base64码通过http传输 +号变 空格 问题解决

    通过七牛云base64上传图片,通过官方示例上传成功后,根据示例改了一个controller. 通过前端往后端传base64码形式进行测试.死活不通过,七牛报400. 仔细排查后发现,示例转换的bas ...

  9. JAVA类(下)

    我看完了Java类,与C++相比,复杂了一点.其中有类的嵌套定义即内部类,枚举类等. 我看这两节花了我很多时间.其中有一些概念还是有点难懂. 下面,我详细总结内部类与枚举类. 内部类 内部类的主要作用 ...

  10. NOIP 模拟 路径求和 - Tarjan+dfs+码

    题目大意: 各一个奇环内向森林,求每两个点对间的距离之和.无法到达则距离为-1. 分析: 首先Tarjan找出size大于1的连通分量(环),环中的边的贡献可以单独计算. 然后从入度为0的点向内dfs ...