在Ubuntu系统中测试Redis连接池——redis++方案

安装依赖

bash 复制代码
sudo apt install gcc
sudo apt install g++
sudo apt install cmake
sudo apt install libhiredis-dev
sudo apt install libssl-dev

安装redis++

bash 复制代码
git clone https://github.com/sewenew/redis-plus-plus.git
cd redis-plus-plus
mkdir build
cd build
cmake ..
make
sudo make install
cd ..

代码

cpp 复制代码
#include <iostream>
#include <thread>
#include <sw/redis++/redis++.h>
#include <sw/redis++/connection.h>
#include <sw/redis++/connection_pool.h>
using namespace sw::redis;

void test_multithreads(Redis redis, int thread_num, int times) {
    std::vector<std::string> keys;
    keys.reserve(thread_num);
    for (auto idx = 0; idx != thread_num; ++idx) {
        auto key = "multi-threads::" + std::to_string(idx);
        keys.push_back(key);
        redis.set(key, key);
    }

    std::vector<std::thread> workers;
    workers.reserve(thread_num);
    for (const auto &key : keys) {
        workers.emplace_back([&redis, key, times]() {
                                try {
                                    for (auto i = 0; i != times; ++i) {
                                        auto val = redis.get(key);
                                        if (!val) {
                                            std::cout<< "failed to test multithreads, cannot get value of " + key << std::endl;
                                            return;
                                        }
                                    }
                                } catch (std::exception &e) {
                                    std::cerr<< "failed to test multithreads, " << e.what() << std::endl;
                                    return;
                                }
                            });
    }

    for (auto &worker : workers) {
        worker.join();
    }
}

int main() {
    ConnectionOptions opts;
    opts.host = "127.0.0.1";
    opts.port = 6379;
    opts.socket_timeout = std::chrono::milliseconds(50);
    opts.keep_alive = true;

    ConnectionPoolOptions pool_opts;
    pool_opts.size = 300;
    
    auto thread_num = 500;
    auto times_in_one_second = 1000000;
    test_multithreads(Redis(opts, pool_opts), thread_num, times_in_one_second);
}

上面代码启动了500个线程,它们公用一个redis连接池。该池子上限被设置为300个。每个线程内部会查询1000000次,以维持程序运行,让我们可以观察到中间连接数变化。

使用下面的脚本进行编译

bash 复制代码
g++ -std=c++17 -o main main.cpp /usr/local/lib/libredis++.a /usr/lib/x86_64-linux-gnu/libhiredis.a -pthread

查看连接数

使用下面命令进入交互界面

bash 复制代码
redis-cli -h 127.0.0.1 -p 6379

然后使用下面命令查看连接数,connected_clients为1,即当前redis-cli的连接。

bash 复制代码
info clients

Clients

connected_clients:1

client_recent_max_input_buffer:8

client_recent_max_output_buffer:0

blocked_clients:0

tracking_clients:0

clients_in_timeout_table:0

在一个新窗口中运行上面编译的测试程序。

bash 复制代码
./main 

然后再查看连接数

Clients

connected_clients:301

client_recent_max_input_buffer:8

client_recent_max_output_buffer:0

blocked_clients:0

tracking_clients:0

clients_in_timeout_table:0

可以看到连接数增加了300。这个和我们代码中设置的连接池大小上限匹配。

参考资料

相关推荐
程序猿(雷霆之王)6 小时前
Linux——进程间通信
linux·运维·服务器
JavaAlpha6 小时前
面试题:Redis 一次性获取大量Key的风险及优化方案
数据库·redis·bootstrap
尽兴-6 小时前
Mac「brew」快速安装Redis
数据库·redis·macos·brew
riveting7 小时前
SD2351核心板:重构AI视觉产业价值链的“超级节点”
大数据·linux·图像处理·人工智能·重构·智能硬件
易保山8 小时前
MIT6.S081 - Lab10 mmap(文件&内存映射)
linux·操作系统·c
禅与Bug的修复艺术8 小时前
JAVA后端开发常用的LINUX命令总结
java·linux·面试·java面试·后端开发·java后端·面试经验
MaCa .BaKa8 小时前
35-疫苗预约管理系统(微服务)
spring boot·redis·微服务·云原生·架构·springcloud
北冥有鱼被烹9 小时前
【微知】/proc中如何查看Linux内核是否允许加载内核模块?(/proc/sys/kernel/modules_disabled)
linux·服务器
qq_273900239 小时前
CentOS系统防火墙服务介绍
linux·运维·centos
小余吃大鱼10 小时前
CentOS中在线安装Docker(超详细)
linux·docker·centos