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/下
- 下载到合适的位置,自己指定
wget http://download.redis.io/releases/redis-6.2.5.tar.gz- 解压
tar -zxvf redis-6.2.5.tar.gz- 编译
cd redis-6.2.5
make- 编译安装依赖文件
cd deps
make hiredis linenoise lua jemalloc
cd hiredis
sudo make install
cd …/lua
sudo make install- 安装redis
cd …/…/src
sudo make install- 启动Redis后台运行
redis-server --daemonize yes
CachePool析构会释放缓存池,但是缓存池是通过指针存储的,动态内存需要手动释放,teamtalk未提供释放所有缓存池的接口,因为所有缓存池所有连接在服务器正常运行时都得重复使用
释放方法,遍历m_cache_pool_map所有缓存池,逐一delete
5. 源码
- 链接:TeamTalk_BlueBling
- 测试demo: tests/test_cachepool.cpp