redis 的通信协议是基于字符串的,设计的很轻巧, 人工可读。

协议名称: RESP - REdis Serialization Protocol

几个简单的规则

  1. +单行回复
  2. -错误回复
  3. :数字回复
  4. $num\r\ndata // num是data的字节count
  5. $-1 // -1表示数据不存在

telnet demo

redis是标准的C/S结构,一般使用自带的redis-cli连接redis实例。

如果条件有限的话, telnet也行,下边使用telnet做demo。

cz@cz-dell:~$ telnet demo.xyz 6379
Trying xxx.xxx.xxx.xxx...
Connected to demo.xyz.
Escape character is '^]'.
auth your-redis-pwd //有密码的话, 这里要做验证
+OK
set year 2021
+OK
year
-ERR unknown command 'year'
incr year
:2022
get year
$4
2022
get book
$4
👍
get bookbook
$-1
ping
+PONG
quit
+OK
Connection closed by foreign host.

redis编码问题

可以看到, redis可以正常读emoji。

实际上, redis server 是没有字符编码的概念的,redis读写的都是bytes.

redis 对于写入的字符具体是什么编码是无感知的,所以redis对于字符串大小的限制,是基于byte的,而不像mysql varchar(100)表示最大100个字符。

mysql varchar(100)在这个table采用不同编码时,最大byte限制是不同的。

utf8mb3时, 最大300byte,100个字符。

utf8mb4时, 最大400byte,100个字符。

client用utf8编码字符串,写入redis,读取bytes时也用utf8解码就可以得到字符串了。

如果client 读写的编码不一样, 就会像读写文本文件一样,出现乱码。

已经2021年了, 字符串编码,utf8基本都是默认配置了,所以乱码情况也比较少见。