Java基础之《redis通讯协议RESP》

1、client:市面上常用的是jedis和lettuce
jedis和lettuce也不是随随便便就能和redis通信的,必须按照redis的协议规范来通信

 

2、什么是redis通讯协议(RESP)
RESP是REdis Serialization Protocol的简称,也就是专门为redis设计的一套序列化协议
这个协议其实在redis的1.2版本时就已经出现了,但是到了redis2.0才最终成为redis通讯协议的标准

3、redis通讯协议(RESP)的格式
Redis的通信协议首先是以行来划分,每行以\r\n行结束。每一行都有一个消息头,消息头共分5种,分别如下:
+表示一个正确的状态信息,具体信息是当前行+后面的字符串
-表示一个错误信息,具体信息是当前行-后面的字符
*表示消息体总共有多少bulk行,不包括当前行,*后面是具体的行数
$表示下一行数据长度,不包括换行符长度\r\n,后面则是对应的长度的数据
:表示返回一个数值,:后面是相应的数字字符

4、例子1
命令“set agan 1”一般被序列化成
*3\r\n$3\r\nset\r\n$4\r\nagan\r\n$1\r\n1\r\n
格式化之后:
*3\r\n:这个命令包含3个(bulk)字符串
$3\r\n:第一个bulk string有3个字节
set\r\n:第一个bulk string是set
$4\r\n:第二个bulk string有4个字节
agan\r\n:第二个bulk string是agan
$1\r\n:第三个bulk string有1个字节
1\r\n:第三个bulk string是1

执行后它的返回是:
+OK\r\n

5、例子2
命令“get agan”序列化为
*2\r\n$3\r\nget\r\n$4\r\nagan\r\n
格式化之后:
*2\r\n:这个命令是2个bulk字符串的数组
$3\r\n:第一个bulk字符串有3个字节
get\r\n:第一个bulk字符串是get
$4\r\n:第二个bulk字符串有4个字节
agan\r\n:第二个bulk字符串是agan

执行后它的返回是:
$1\r\n1\r\n

6、使用telnet来测试命令
telnet <hostname> <port>
auth <password>
使用telnet执行RESP格式的“get agan”:*2\r\n$3\r\nget\r\n$4\r\nagan\r\n
*2
$3
get
$4
agan
返回:
$1
1

7、redis集群3主3从,spring配置文件该配几个ip?配1个还是6个?
如果配1个,那spring如何知道其他5个?
如果配6个,那配错一个ip会有说明后果?
答:
无论配置文件配置多少个redis ip,它都会读取redis拓扑结构信息,最终解析成一个Partitions对象
例如配置了2个ip,建立tcp redis连接,发送cluster nodes命令和info clients命令,把拿到的节点信息都合并去重后得到Partitions对象
Partitions是cluster nodes信息类,也是拓扑结构图类,并且包含了槽数组信息,16384个槽位,每个槽位存储一个节点ip(RedisClusterNode(redis节点))

如果配错1个ip,不会有什么后果,因为它会去检测并且合并去重

8、spring如何知道redis每个节点有多少个槽号?
答:springboot启动后,第一次请求redis时,通过读取配置文件中的redis ip port,然后发送cluster nodes命令,拿到nodes信息,自然就得到了每个节点的槽信息

9、spring如何实现redis槽和节点之间的映射关系?
得到nodes信息后,提取master节点信息,剔除slave节点。(因为默认情况下,都是在master上读写的)调用Partitions.updateCache()方法,初始化创建一个大小为16384的数组,
private volatile RedisClusterNode slotCache[] 数组的坐标就是槽位,数组的value就是master节点RedisClusterNode对象,
槽和节点的映射关系:数组16384个元素,坐标=槽,value=节点,一个槽号对应一个节点ip

10、spring如何计算redis哈希槽?
get alex,如何转换为哈希槽。
采用CRC16.crc(key)%16384,redis采用CRC16来计算哈希值,然后16384取余,得到了哈希槽
CRC16是一种很复杂的算法,它的原理就是把文本转换为哈希值
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值