TeamTalk CachePool详解

1. 简介

这是一个基于hiRedis实现的redis连接池。

2. hiRedis使用方法

一般顺序为先用 redisConnect 连接数据库,然后用 redisCommand 执行命令,执行完后用 freeReplyObject 来释放redisReply对象,最后用 redisFree 来释放整个连接。参考https://www.jianshu.com/p/361b6dd7261f、https://www.cnblogs.com/jabnih/p/4814212.html

3. 类与接口

CacheConn封装了redis的业务操作;
Init调用redisConnectWithTimeout连接数据库,再调用redisCommand执行SELECT命令选择数据库;
析构函数调用redisFree释放连接。

CachePool成员变量m_free_list预先存储着若干个与redis的连接对象,类型为CacheConn,需要时,直接从空闲链表里获取而节省时间;
使用CThreadNotify类型的条件变量解决共享变量m_free_list的竞争问题;
使用m_cur_conn_cnt记录创建连接次数创建加1释放不减少;
GetCacheConn用于获取CacheConn,若m_free_list为空且创建连接次数未超过最大值则创建连接加入空闲链表,若m_free_list不空则取出一个连接;
RelCacheConn将指定连接归还到m_free_list。

CacheManager用于创建redis连接池管理器单例;
成员变量m_cache_pool_map存储了配置文件配置的redis缓存池,这是一个map对象,key是缓存池的名字,value是缓存池CachePool对象的指针;
Init函数创建好所有缓存池同时创建好所有池里所有连接供业务使用;GetCacheConn和RelCacheConn分别从缓存池里取出归还redis连接,实际调用的是CachePool内部的同名接口。

4. test_cachepool说明

teamtalk原本方案是直接编译hiredis源码,将头文件和库文件拷贝到自己工程里,参见make_hiredis.sh;
这里ubuntu 16.04直接源码编译安装,默认安装到/usr/local/下

  1. 下载到合适的位置,自己指定
    wget http://download.redis.io/releases/redis-6.2.5.tar.gz
  2. 解压
    tar -zxvf redis-6.2.5.tar.gz
  3. 编译
    cd redis-6.2.5
    make
  4. 编译安装依赖文件
    cd deps
    make hiredis linenoise lua jemalloc
    cd hiredis
    sudo make install
    cd …/lua
    sudo make install
  5. 安装redis
    cd …/…/src
    sudo make install
  6. 启动Redis后台运行
    redis-server --daemonize yes

CachePool析构会释放缓存池,但是缓存池是通过指针存储的,动态内存需要手动释放,teamtalk未提供释放所有缓存池的接口,因为所有缓存池所有连接在服务器正常运行时都得重复使用
释放方法,遍历m_cache_pool_map所有缓存池,逐一delete

5. 源码
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值