性能测试之数据准备、Redis Cluster缓存清理

本文为博主原创,未经授权,严禁转载及使用。
本文链接:https://blog.csdn.net/zyooooxie/article/details/123822776

最近接了个需求,我们系统做为基础能力,提供给其他组N个接口,故而做了些压测;因为测试环境数据量比较少 + 每次压测后都有5W多的缓存要清理,想着做期关于 数据准备+清理缓存 的分享。

【实际这篇博客推迟发布N个月】

【以下所有内容仅为个人项目经历,如有不同,纯属正常】

个人博客:https://blog.csdn.net/zyooooxie

数据准备【数据库 表】

压测 为了压出效果,我想着 多准备点数据( 线上数据量*2);

造假数据 直接使用Faker库,我之前分享过 https://blog.csdn.net/zyooooxie/article/details/124680302

不过这次说点 ‘不同的’,还要从一个bug说起:

有个接口要传参 一个日期,根据字段值 对表里的create_date字段【datetime】做筛选;实际我用脚本造数据时,‘误打误撞’传了date格式的值,表里存的是 这个日期的00:00:00;在测接口时,发现这几条数据没被算进来。

(后来我们开发改了这条SQL,由原本的 > 改为>=)

在这里插入图片描述

我要反思下:造数据时,一直依赖Faker库,完全忘记了 边界值测试。很惭愧。

代码做‘特别调整’

"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""

def create_external_user(nums: int, qw_user_id: str, create_date: datetime.date = None):
    f = faker.Faker('zh_CN')
	
	create_user = qw_user_id

    if create_date is None:
        create_date = datetime.date.today()
    print(create_date, 'create_date')

    create_date_0 = datetime.date.today()
    print(create_date_0, type(create_date_0))

    # time.min = time(0, 0, 0)
    # time.max = time(23, 59, 59, 999999)

    create_date_1 = datetime.datetime.combine(create_date, datetime.time.min)
    print(create_date_1, type(create_date_1))

    # create_date_2 = datetime.datetime.combine(create_date, datetime.time.max)
    create_date_2 = datetime.datetime.combine(create_date, datetime.time(hour=23, minute=59, second=59))
    print(create_date_2, type(create_date_2))

    add_time = (datetime.datetime.now() + datetime.timedelta(days=-1 * random.randint(10, 19))).strftime(
        '%Y-%m-%d %H:%M:%S')
    all_data = list()

    for i in range(nums):

        # create_date = create_date_0
        create_date = f.date_time_between(start_date=create_date_1, end_date=create_date_2) if random.getrandbits(
            1) else random.choice([create_date_1, create_date_2])

        user_id = 'wm' + f.uuid4().replace('-', '')
        gender = f.random_choices(elements=(1, 2), length=1)[0]

        name = f.name()

        ele = (create_date, create_user, user_id, gender, name)

        all_data.append(ele)

    return all_data

数据准备【JMeter参数化】

  1. 把 表的某个字段 所有值全部取出来,用做参数化。

压测情景: 某接口的传参user_id,不能随便传,要取表里 已有的值。

"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""

def write_txt():

    sql = """
        SELECT DISTINCT user_id FROM table_user WHERE user_id IS NOT NULL;
        """

    data = fetch_sql(sql=sql, db_name='zyooooxie_db', fetch_mode='fetchall')

    # data_list = [''.join([d[0], '\n']) if len(data) - 1 != d_index else d[0] for d_index, d in
    #              enumerate(data)]  # 最后一条 没有换行符
    data_list = [''.join([d[0], '\n']) for d in data]

    Log.info(data_list[-10:])

    file = 'user_id.txt'

    with open(file, mode='w', encoding='utf-8') as f:
        f.writelines(data_list)

  1. 对表里某些数据 做了处理后,用做参数化。

压测情景: 某接口的传参 abc_json,不能随便传,要取表里字段已有的值 做个处理、组装。

【这是我给别人写的。传参 abc_json 所需的值 分了2种:(150个成员)、(随机数量、小于150个成员) ;大概思路:先取出来 所有data,再从data 取(每个请求(150条) * 请求数量),剩下的data 分给 (总请求数 - 150个成员的请求数)】

"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""


def test_1122(db: Connection, cur: Cursor, len_150: int, csv_nums: int, ):
    sql = """
    SELECT  abpcb.emp_, abum.manage_, abpcb.user_id, abpcb.user_name, abpcb.id, abpcb.act_, abpcb.act_, abpcb.promotion_ 
	FROM table_a_b_p_c  abpcb 
    LEFT JOIN table_a_b_u_m abum ON abpcb.emp_ = abum.manage_
    WHERE abpcb.delete_flag = 0 AND abum.delete_flag = 0  AND abpcb.act_ = 123  
	GROUP BY abpcb.id  
	ORDER BY abpcb.update_tm DESC ; 
    """
    data = fetch_sql(sql, fetch_mode='fetchall', db_name='cempwechat_db', db=db, cur=cur)

    data = [{'spNo': d[0], 'spName': d[1], 'userId': d[2], 'userName': d[3], 'actId': d[4], 'act': d[5],
             'act_': d[6], 'promotion': d[7]} for d in data]
    Log.info(len(data))
    # Log.info(data[-5:])

    random.shuffle(data)

    res = list()
    every_150_len = 150
    Log.info(f'{len_150},{every_150_len}')

    for i in range(len_150):
        d = data[i * every_150_len: (i + 1) * every_150_len]
        res.append([json.dumps(d, ensure_ascii=False)])

    used = len_150 * every_150_len

    data_ = data[used:]
    Log.info(f'剩余长度:{len(data_)}')

    no_used = csv_nums - len_150

    if no_used:
        every_len_ = math.floor(len(data_) / no_used)

        Log.info(f'{no_used},{every_len_}')

        for i in range(no_used):
            d = data_[i * every_len_: (i + 1) * every_len_]

            res.append([json.dumps(d, ensure_ascii=False)])

    random.shuffle(res)
    write_txt(res)
	

redis集群 缓存清理-KEYS命令

【测试环境,那就 KEYS命令给它安排上】

http://doc.redisfans.com/key/keys.html
https://redis.io/commands/keys/

"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""


def cluster_get_key_Use_KEYS(key_name: str, rc: RedisCluster, target_nodes: str = RedisCluster.PRIMARIES):
    """

    :param key_name:
    :param rc:
    :param target_nodes:
    :return:
    """

    # keys命令 使用: 只能在测试环境 + 单独业务使用的集群
    data_list = rc.keys(key_name, target_nodes=target_nodes)

    Log.info(f'keys命令 查找到的所有key的数量:{len(data_list)}')
    Log.info(data_list[-10:])

    return data_list

拿到 所有key的name,调 DEL 、UNLINK命令 (对应 delete() 、 unlink())。 可以 参考之前写的 https://blog.csdn.net/zyooooxie/article/details/120334491

本文链接:https://blog.csdn.net/zyooooxie/article/details/123822776

交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值