Redis++源码学习1

本文详细剖析了如何使用Redis++库,包括创建ConnectionOptions和ConnectionPoolOptions,连接过程中的安全连接管理,以及通过command函数执行命令的底层实现,重点介绍了连接池的工作原理和创建新连接的逻辑。
摘要由CSDN通过智能技术生成

为了更好使用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

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值