Redis-Jedis的MOVED_ASK实现
Jedis-2.9.0版本,最近在看Redis Cluster的槽位(Slot)迁移,其中涉及MOVED、ASK命令 MOVED:key已被迁移到目标节点node上(已迁移完成),则返回MOVED命令并携带目标节点的node,刷新客户端的槽缓存,Redis客户端收到后再次请求新目标节点 ASK:为什么需要ASK命令,为什么不能仅用MOVED解决?MOVED命令表示后续该key都由新节点处理,ASK命令仅仅表示单个这次的key处理由新节点尝试解决,后面的该key还是继续会发到之前的节点 Jedis客户端实现如下, 通过CRC16计算出槽位对应的目标节点,之后请求目标节点 如果请求出错,则Jedis会重试maxAttemps次,重试完抛出Too many Cluster redirections...
Redis-Dict字典实现
如下是dict字典的数据结构 ht[2]对应俩个hash,主要使用ht[0]存储数据,ht[1]用于进行扩容 rehashidx一般是-1表示当前没有在进行扩容,rehashidx如果是2,则表示当前在进行ht[0]到ht[1]的数据迁移,正在迁移 ht[0]中下标是2的槽位对应的链表 Ht[0]中的used表示ht[0]的一位数组槽位上多少个是有值的,即不为null的槽位个数 #dict.h //字典 typedef struct dict { dictType...
Redis-Redisson公平锁实现
Redisson公平锁源码(Redisson 3.24.0版本),由以下几个数据结构组成: Redis Hash 数据结构:存放当前锁,Redis Key 就是锁,Hash 的 field 是加锁线程,Hash 的 value...
Redis-通信Resp协议剖析
Redis客户端与服务器交互采用序列化协议(RESP),请求以字符串数组的形式来表示要执行命令的参数。用命令特有(command-specific)数据类型作为回复。 通信协议的特点 客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 。 客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾。 在这个协议中,...
网络-应用层到物理层到服务器的流程
ARP协议(Address Resolution Protocol):在局域网中,当主机或其它三层网络设备有数据要发送给另一台主机或三层网络设备时,需要知道对方的网络层地址(即IP地址)。但是仅有IP地址是不够的,因为IP报文必须封装成帧才能通过物理网络发送,因此发送方还需要知道接收方的物理地址(即MAC地址),这就需要一个通过IP地址获取物理地址的协议,以完成从IP地址到MAC地址的映射。地址解析协议ARP即可实现将IP地址解析为MAC地址 NAT协议(Network Address Translation):NAT协议是将IP数据报头中的IP地址转换为另外一个IP地址的过程, 主要用于实现私有网络访问公有网络的功能。这种通过使用少量的IP地址代表较多的私有IP地址的方式,将有助于减少IP地址空间的枯竭 数据传输过程中的封装和解封过程: OSI七层/四层网络对应的协议: 本地电脑访问远程服务器,数据包封装和解析的流程: 【本地】通过ARP协议去获取目标服务器的MAC地址,网关发现目标IP非同一个网段,返回网关的MAC 【本地】将本地端口、目标端口、本地IP、目标IP封装到包中...