cpp_redis是一个基于c++11编写的redis客户端,比较简单,也比较强大,支持集群
本篇分析是基于一个简单的set命令来展开的
为了便于调试和查看代码运行轨迹,编译时用如下命令:
cmake -DBUILD_EXAMPLES=true -DLOGGING_ENABLED=true .
这是查看完CMakefile.txt后得出的
cpp_redis使用了tacopie库,这个库的作者和cpp_redis是一个人,类结构层次如下:
tacopie:
tcp_client {io_service, m_socket, std::queue<read_request> m_read_requests, std::queue<write_request> m_write_requests}
io_service
{
std::unordered_map<fd_t, tracked_socket> m_tracked_sockets,
std::thread m_poll_worker;
utils::thread_pool m_callback_workers;
{
std::vector<std::thread> m_workers; 线程
std::queue<task_t> m_tasks; 函数
}
std::vector<struct pollfd> m_poll_fds_info;
tacopie::self_pipe m_notifier; pipe;
std::condition_variable m_wait_for_removal_condvar;
io_service::wait_for_removal(const tcp_socket& socket)
循环等待直到socket不在m_tracked_sockets中
tcp_client::disconnect(bool wait_for_removal)如果指定wait_for_removal为true,调用
}
m_socket
tcp_socket {m_fd, m_host, m_port, m_type}
cpp_redis:
future_client {
redis_client m_client
{
redis_connection
{
tacopie::tcp_client m_client;
reply_callback_t m_reply_callback;
std::function<void(redis_connection&, reply&)>
void redis_client::connection_receive_handler(network::redis_connection&, reply& reply)
从redis_client对象的m_callbacks中取出1个
如果用户定义了m_before_callback_handler,则执行m_before_callback_handler(reply, callback);
callback也作为参数传递给用户的回调函数,用户可选择性调callback