为了更好使用Redis++库,分析了源码,了解了命令的发送过程及连接池管理细节等。草草做了笔记留存。
创建ConnectionOptions
创建ConnectionPoolOptions
创建redis(ConnectionOptions, ConnectionPoolOptions)
执行redis.auth()
调用Redis::command 模板函数(传入具体命令函数如cmd::set和对应参数)
内部判断是单连接还是连接池,若是连接池
创建 SafeConnection connection(*_pool); (可自动归还连接)
在构造函数初始化列表里初始化_pool 和 _connection
其中_connection通过调用_pool.fetch()返回的Connection对象拷贝构造
fetch()调用了_fetch()
先判断是否有可用连接,有则直接用,
否则判断是否达到上限,是则等待,否则 创建新的连接并返回
创建新连接:Connection(_opts, Connection::Dummy{})
构造函数初始化列表_ctx(Connector(opts).connect())
使用_opts构造了Connector并调用了其connect()来初始化ContextUPtr对象_ctx
Connection::ContextUPtr Connection::Connector::_connect()
using ContextUPtr = std::unique_ptr<redisContext, ContextDeleter>;
确定是调用windowsconnect还是linux
windows:调用 Connection::Connector::_connect_tcp();
内部根据是否设置超时,对应调用了hiredis的连接函数
有带超时和不带超时两种函数
哨兵模式的相关处理
判断是否需要重连
执行 _command(connection.connection(), cmd, std::forward<Args>(args)...);
connection.connection() 返回上面创建的Connection连接对象
通过传入的连接、具体命令函数、结合相关参数执行命令
所有命令函数定义在namespace cmd命名空间
通过调用connection.send()发送命令字符串
内部调用_context()获取redisContext,同时设置其_last_active
调用ContextUPtr.get返回redisContext