| 操作系统 | CentOS Linux release 7.3.1611 (Core) |
| Redis | Redis server v=6.2.14 |
| Python | Python 3.6.8 |
任务需按 **“环境准备→任务执行→流量监控”** 的逻辑分步操作,以下是详细步骤(含配置修复、代码实现、工具使用),确保每一步可落地:
前置准备:确保 Redis 可正常运行且支持远程连接
首先解决之前 Redis 启动失败(
status=217/USER)的问题,并配置 Redis 允许 172.21.204.200 访问(否则 200 无法连接 201 的 Redis)。任务 1:在 172.21.204.201 的 Redis 上新建 Key
需创建普通小 Key和大 Value 的 Key(为任务 3 “大带宽读取” 做准备,小 Key 无法占用大量带宽)。
1.1. 连接Redis(若设密码,加 -a 密码,或连接后AUTH)
redis-cli -h 172.21.204.201 # 若有密码:redis-cli -h 172.21.204.201 -a your_redis_password
1.2. 新建普通小Key(用于测试基础读写)
set user:1 '{"name":"test","age":20}' set product:1001 "iPhone 15" mset city:beijing "capital" city:shanghai "finance" # 批量设Key
1.3. 新建大Value的Key(10MB/个,用于任务3占用带宽)
# 生成10MB的随机字符串(通过循环拼接实现) 方法1: redis-cli -h 172.21.204.201 -a your_redis_password set bigkey:1 $(printf "x%.0s" {1..10485760}) redis-cli -h 172.21.204.201 -a your_redis_password set bigkey:2 $(printf "y%.0s" {1..10485760}) -bash: /usr/bin/redis-cli: Argument list too long # 报错 方法2: # 生成 10MB 的文件(内容为重复的空字节,如需 "x" 可后续替换,不影响带宽测试) dd if=/dev/zero of=/tmp/bigvalue.txt bs=10485760 count=1 # 解释: # if=/dev/zero:从空字节设备读取(生成纯空内容) # of=/tmp/bigvalue.txt:输出到临时文件 # bs=10485760:每次读写 10MB(10*1024*1024) # count=1:只读写 1 次,总大小 = 10MB*1 = 10MB # 将 /tmp/bigvalue.txt 的内容设置为 bigkey:1 的值 redis-cli -h 172.21.204.201 -x set bigkey:1 < /tmp/bigvalue.txt # 检查 Key 的长度(单位:字节,应为 10485760) redis-cli -h 172.21.204.201 strlen bigkey:1 # 输出应为:(integer) 10485760 如需生成纯 "x" 字符的大文件 若必须用 "x" 填充(非空字节),可先用 head 生成: # 生成 10MB 的 "x" 字符文件(通过循环拼接) yes x | head -c 10485760 > /tmp/bigvalue_x.txt # 再设置 Key redis-cli -h 172.21.204.201 -x set bigkey:1 < /tmp/bigvalue_x.txt redis-cli -h 172.21.204.201 -a your_redis_password strlen bigkey:1 # 确认大Key长度(10485760 = 10MB)
1.4.查看所有key
redis-cli -h 172.21.204.201 keys "*" 1) "bigkey:2" 2) "product:1001" 3) "city:beijing" 4) "city:shanghai" 5) "bigkey:1" 6) "user:1"
任务 2:在 172.21.204.200 上用 Python3 操作 Redis
需先安装 Redis Python 客户端,再编写代码实现 “连接→读写 Key”。
2.1. 204.200 机器环境准备
# 安装Python3和redis库(CentOS示例)
yum install -y python3 python3-pip
pip3 install redis # Redis Python客户端(redis-py)
2.2. Python 操作 Redis 代码(基础读写)
创建
redis_operation.py,实现连接、读小 Key、读大 Key:import redis
# 1. 配置Redis连接信息(需与201的Redis配置一致)
REDIS_CONFIG = {
"host": "172.21.204.201",
"port": 6379,
"db": 0, # 操作的数据库(默认16个,0-15)
"password": "your_redis_password", # 若未设密码,删除该参数
"socket_timeout": 5, # 连接超时时间
"decode_responses": True # 使返回值为字符串(而非bytes)
}
# 2. 连接Redis并操作
try:
# 建立连接
r = redis.Redis(**REDIS_CONFIG)
print("Redis连接成功!")
# (1)读普通小Key
print("\n=== 读取普通Key ===")
print(f"user:1 = {r.get('user:1')}")
print(f"product:1001 = {r.get('product:1001')}")
print(f"city:beijing = {r.get('city:beijing')}")
# (2)读大Key(验证大Value读取)
print("\n=== 读取大Key ===")
bigkey1_len = len(r.get("bigkey:1"))
print(f"bigkey:1 长度 = {bigkey1_len} 字节({bigkey1_len/1024/1024:.2f} MB)")
except Exception as e:
print(f"Redis操作失败:{str(e)}")
finally:
if "r" in locals():
r.close() # 关闭连接
2.3. 运行代码验证
python3 redis_operation.py
# 预期输出:连接成功 + 各Key的value,证明200可正常操作201的Redis
任务 3:在 204.200 上模拟高并发读取 + 大带宽占用
核心思路:用多线程循环读取 “大 Key”(如 10MB 的
bigkey:1),通过 “高并发 + 大数据量” 触发大带宽消耗。3.1. 高并发读取代码(redis_high_concurrency.py)
使用
threading库创建大量线程,每个线程循环读取大 Key(线程数和循环次数可根据机器性能调整):import redis
import threading
import time
from concurrent.futures import ThreadPoolExecutor
# 1. 配置(重点:读大Key,线程数控制在100-200为宜,避免压垮Redis)
REDIS_CONFIG = {
"host": "172.21.204.201",
"port": 6379,
"db": 0,
"password": "your_redis_password",
"socket_timeout": 10
}
BIG_KEY = "bigkey:1" # 读取的大Key(10MB)
THREAD_NUM = 150 # 并发线程数(根据200机器CPU调整,建议≤200)
LOOP_TIMES = 200 # 每个线程循环读取次数
# 2. 单个线程的读取任务
def read_bigkey(task_id):
"""每个线程循环读取大Key,统计成功次数"""
success_count = 0
try:
# 每个线程单独建立Redis连接(避免连接池瓶颈)
r = redis.Redis(**REDIS_CONFIG)
print(f"线程{task_id}:启动,开始循环读取{LOOP_TIMES}次{BIG_KEY}")
for i in range(LOOP_TIMES):
# 读取大Key(忽略返回值,仅关注“读取动作”占用带宽)
r.get(BIG_KEY)
success_count += 1
# 每10次打印一次进度
if (i + 1) % 10 == 0:
print(f"线程{task_id}:已完成{i+1}/{LOOP_TIMES}次读取")
except Exception as e:
print(f"线程{task_id}:出错 -> {str(e)}")
finally:
if "r" in locals():
r.close()
return success_count
# 3. 启动高并发任务
if __name__ == "__main__":
print(f"=== 开始模拟高并发读取:{THREAD_NUM}线程,每个线程读{LOOP_TIMES}次{BIG_KEY} ===")
start_time = time.time()
# 使用线程池管理并发
with ThreadPoolExecutor(max_workers=THREAD_NUM) as executor:
# 提交所有线程任务
tasks = [executor.submit(read_bigkey, i) for i in range(THREAD_NUM)]
# 统计总成功次数
total_success = sum(task.result() for task in tasks)
# 计算总数据量和耗时
total_data_mb = total_success * 10 # 每个大Key≈10MB
total_time = time.time() - start_time
print(f"\n=== 高并发读取结束 ===")
print(f"总读取次数:{total_success}")
print(f"总数据量:{total_data_mb:.2f} MB(约