说明
本文章仅用于个人在学习redis后,对redis相关概念、协议特性做一个总结,文章内容可能并非完全准确。
什么是Redis?
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value存储系统
- 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
Redis通信协议分析
Redis通信协议采用RESP协议,RESP协议属于人类可读的一种文本协议,协议本身属于一问一答类型,即通常情况下(非Pub/Sub模式),每个请求应该对应一个响应。
请求报文格式分析
Redis请求报文主要有两种格式,批量命令(Multi Bulk Command)和内联命令(inlineCommand):
Multi Bulk Command
多条批量命令使用数组的形式,每个元素表示一个命令及其参数。命令和参数按顺序排列,并用 CRLF(回车换行)分隔。
(这里将换行符\r\n用直观的换行效果展示)
*<number of arguments>
$<length of argument 1>
<argument 1>
$<length of argument 2>
<argument 2>
...
$<length of argument N>
<argument N>
示例
*3
$3
SET
$5
mykey
$7
myvalue
inline Command
内联命令以行为单位,每行包含一个命令及其参数。命令和参数之间使用空格分隔。
<command> arg1 arg2 arg3 ...
响应报文格式分析
Redis响应报文主要包括执行命令的结果、查询结果数据集等,响应报文的格式较多,具体可参考redis官方文档: redis。
RESP2/RESP3
- RESP3 是 RESP2 的超集,目前连接默认采用的协议是RESP2,可通过在连接上使用
HELLO
命令显示地升级协议到resp3 - 设计RESP3目的主要是为了简化客户端的开发:RESP 也有缺陷。其中最明显的一点是,它没有足够的语义能力让客户端隐式地理解哪种转换是合适的。例如,Redis 命令 LRANGE、SMEMBERS 和 HGETALL 都会回复一个数组,在 RESP v2 中称为多重批量回复。但这三个命令实际上返回的是一个数组、一个集合和一个映射。目前,从客户端的角度来看,将回复转换为编程语言类型取决于命令。客户端需要记住调用了什么命令,才能将 Redis 的回复转换成某种回复对象。更糟糕的是,客户端需要了解每一条命令,或者提供一个较低级别的界面,让用户选择适当的转换。对RESP2和RESP3的详细阐述参考RESP2/3。
RESP协议解析
- 对于redis RESP协议的解析,hiredis提供了对RESP响应报文的解析支持,具体使用方式可参考hiredis源码中的使用示例
test.C
。 - 对于RESP请求报文的解析,由于请求报文两种格式相对固定,可自行封装相关函数进行解析,当然也可以参考redis源码中的相关实现。
Redis 认证机制
redis目前主要有3种安全认证机制:
- 密码认证
- 用户名/密码认证 (redis acl, Redis6.0引入)
- tls双向认证
关于三种认证方式的详细介绍,读者可参考redis官方文档 redis中的相应章节。
Redis数据库
- Redis有16个数据库,默认使用的是0号数据库,切换数据库可通过
select n
命令切换,如果是使用命令行客户端,有的客户端例如redis-cli支持redis-cli -n 1
来指定使用的db分区; - 尽管有16个数据库可供选择,但在实际应用中,通常建议仅使用一个或几个数据库,以避免潜在的混淆和管理复杂性。
搭建Redis环境
在学习和使用redis时可使用docker方便的搭建redis环境,相关文章很多,可自行搜索。
常见的Redis Gui客户端
- RedisInsight,目前redis官网主推的客户端
- RedisDesktopManager,已经逐步向RedisInsight过渡
- Another Redis Desktop Manager
再次说明
本文章仅作为个人学习redis的总结,内容正确性无法保证,要获取最准确的信息,请参考redis官方文档^^。