import time from argparse import ArgumentParser from functools import wraps import redis def parse_args(): parser = ArgumentParser() parser.add_argument( "-n", type=int, help="Total number of requests (default 100000)", default=100000 ) parser.add_argument( "-P", type=int, help=("Pipeline requests." " Default 1 (no pipeline)."), default=1, ) parser.add_argument( "-s", type=int, help="Data size of SET/GET value in bytes (default 2)", default=2, ) args = parser.parse_args() return args def run(): args = parse_args() r = redis.Redis() r.flushall() set_str(conn=r, num=args.n, pipeline_size=args.P, data_size=args.s) set_int(conn=r, num=args.n, pipeline_size=args.P, data_size=args.s) get_str(conn=r, num=args.n, pipeline_size=args.P, data_size=args.s) get_int(conn=r, num=args.n, pipeline_size=args.P, data_size=args.s) incr(conn=r, num=args.n, pipeline_size=args.P, data_size=args.s) lpush(conn=r, num=args.n, pipeline_size=args.P, data_size=args.s) lrange_300(conn=r, num=args.n, pipeline_size=args.P, data_size=args.s) lpop(conn=r, num=args.n, pipeline_size=args.P, data_size=args.s) hmset(conn=r, num=args.n, pipeline_size=args.P, data_size=args.s) def timer(func): @wraps(func) def wrapper(*args, **kwargs): start = time.monotonic() ret = func(*args, **kwargs) duration = time.monotonic() - start if "num" in kwargs: count = kwargs["num"] else: count = args[1] print(f"{func.__name__} - {count} Requests") print(f"Duration = {duration}") print(f"Rate = {count/duration}") print() return ret return wrapper @timer def set_str(conn, num, pipeline_size, data_size): if pipeline_size > 1: conn = conn.pipeline() set_data = "a".ljust(data_size, "0") for i in range(num): conn.set(f"set_str:{i}", set_data) if pipeline_size > 1 and i % pipeline_size == 0: conn.execute() if pipeline_size > 1: conn.execute() @timer def set_int(conn, num, pipeline_size, data_size): if pipeline_size > 1: conn = conn.pipeline() set_data = 10 ** (data_size - 1) for i in range(num): conn.set(f"set_int:{i}", set_data) if pipeline_size > 1 and i % pipeline_size == 0: conn.execute() if pipeline_size > 1: conn.execute() @timer def get_str(conn, num, pipeline_size, data_size): if pipeline_size > 1: conn = conn.pipeline() for i in range(num): conn.get(f"set_str:{i}") if pipeline_size > 1 and i % pipeline_size == 0: conn.execute() if pipeline_size > 1: conn.execute() @timer def get_int(conn, num, pipeline_size, data_size): if pipeline_size > 1: conn = conn.pipeline() for i in range(num): conn.get(f"set_int:{i}") if pipeline_size > 1 and i % pipeline_size == 0: conn.execute() if pipeline_size > 1: conn.execute() @timer def incr(conn, num, pipeline_size, *args, **kwargs): if pipeline_size > 1: conn = conn.pipeline() for i in range(num): conn.incr("incr_key") if pipeline_size > 1 and i % pipeline_size == 0: conn.execute() if pipeline_size > 1: conn.execute() @timer def lpush(conn, num, pipeline_size, data_size): if pipeline_size > 1: conn = conn.pipeline() set_data = 10 ** (data_size - 1) for i in range(num): conn.lpush("lpush_key", set_data) if pipeline_size > 1 and i % pipeline_size == 0: conn.execute() if pipeline_size > 1: conn.execute() @timer def lrange_300(conn, num, pipeline_size, data_size): if pipeline_size > 1: conn = conn.pipeline() for i in range(num): conn.lrange("lpush_key", i, i + 300) if pipeline_size > 1 and i % pipeline_size == 0: conn.execute() if pipeline_size > 1: conn.execute() @timer def lpop(conn, num, pipeline_size, data_size): if pipeline_size > 1: conn = conn.pipeline() for i in range(num): conn.lpop("lpush_key") if pipeline_size > 1 and i % pipeline_size == 0: conn.execute() if pipeline_size > 1: conn.execute() @timer def hmset(conn, num, pipeline_size, data_size): if pipeline_size > 1: conn = conn.pipeline() set_data = {"str_value": "string", "int_value": 123456, "float_value": 123456.0} for i in range(num): conn.hmset("hmset_key", set_data) if pipeline_size > 1 and i % pipeline_size == 0: conn.execute() if pipeline_size > 1: conn.execute() if __name__ == "__main__": run()