使用Locust对Redis进行负载测试

1.安装环境

安装redis

brew install redis

开启redis服务

brew services start redis

停止redis服务

brew services stop redis

安装Python库

pip install locust redis

2.编写脚本

loadTest.py

# coding=utf-8
import json
import random
import time
import redis
from locust import User, events, task, tag
from typing import Optional

host_name = "localhost"
port_no = 6379


def _execute(command: str, key: str, func, *args, **kwargs) -> Optional[object]:
    """
    通用方法:执行 Redis 操作并触发 Locust 事件
    """
    start_time = time.time()
    try:
        result = func(key, *args, **kwargs)
        total_time = int((time.time() - start_time) * 1000)
        response_length = len(str(result)) if result else 0
        events.request.fire(
            request_type=command,
            name=key,
            response_time=total_time,
            response_length=response_length,
            exception=None
        )
        return result
    except Exception as e:
        total_time = int((time.time() - start_time) * 1000)
        events.request.fire(
            request_type=command,
            name=key,
            response_time=total_time,
            response_length=0,
            exception=e
        )
        return None


class RedisClient:
    def __init__(self, host: str = host_name, port: int = port_no):
        self.rc = redis.StrictRedis(host=host, port=port)

    def get_query_string(self, key: str):
        return _execute("GET", key, self.rc.get)

    def set_query_string(self, key: str, value: Optional[dict] = None):
        value = value or {"bids": random.randint(47238, 57238)}
        return _execute("SET", key, self.rc.set, json.dumps(value))

    def lpush_in_list(self, key: str):
        return _execute("LPUSH", key, self.rc.lpush, 0, 0, 0, 0, 0)

    def sadd_in_set(self, key: str):
        visitors = {"dan", "jon", "alex"}
        return _execute("SADD", key, self.rc.sadd, *visitors)

    def hset_in_hash(self, key: str, field: str = "1", value: str = "One"):
        return _execute("HSET", key, self.rc.hset, field, value)

    def hget_in_hash(self, key: str, field: str = "1"):
        return _execute("HGET", key, self.rc.hget, field)

    def hdel_in_hash(self, key: str, field: str = "1"):
        return _execute("HDEL", key, self.rc.hdel, field)

    def zadd_in_sorted_set(self, key: str, player_name: str = "Player1", score: int = 56):
        return _execute("ZADD", key, self.rc.zadd, {player_name: score}, nx=False)

    def zrange_in_sorted_set(self, key: str):
        return _execute("ZRANGE", key, self.rc.zrange, 0, -1)


class RedisLocust(User):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.client = RedisClient()

    @task
    @tag("string")
    def string_operations(self):
        self.client.set_query_string("string_set_operation")
        self.client.get_query_string("string_get_operation")

    @task
    @tag("list")
    def list_operation(self):
        self.client.lpush_in_list("list_lpush_operation")

    @task
    @tag("set")
    def set_operation(self):
        self.client.sadd_in_set("set_sadd_operation")

    @task
    @tag("hash")
    def hash_operation(self):
        self.client.hset_in_hash("hash_hset_operation")
        self.client.hget_in_hash("hash_hget_operation")
        self.client.hdel_in_hash("hash_hdel_operation")

    @task
    @tag("sorted-set")
    def sorted_set_operation(self):
        self.client.zadd_in_sorted_set("sorted_set_zadd_operation")
        self.client.zrange_in_sorted_set("sorted_set_zrange_operation")

3.执行测试

打开终端执行命令

locust -f loadTest1.py --headless -u 1 -r 1 -t 10s

参数解释

-u:并发用户数,配合--headless使用

-r:每秒生成用户的速率

-t:执行时间

执行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值