一,什么是Redis

Redis是一个非关系型数据库,仅使用内存储存数据,避免了I/O的限制,显著提升了数据访问效率。
Redis可以用于缓存,订阅,消息队列,计数器(浏览数,播放数)。本文探讨redis缓存功能的测试。
Redis缓存是在服务端部署的一个非关系型数据库NOSQL,用于客户端和数据库DB直接的层级,客户端发出请求,先在redis中查找,redis中查寻不到再到达DB中查询。大大缓解了数据库的压力。
所以Redis的特性是速度快,响应快

Redis有几种基础数据类型:
1,string
2,hash哈希
3,list列表
4,set集合
5,zset有序集合

二,Redis缓存测什么

Redis缓存测试主要测试功能和性能两个方面

1,功能方面
1.1,测试点:
缓存中有缓存数据,正确获取缓存数据
在缓存中增加数据,删除数据,redis中缓存数据正确
缓存中没有缓存数据,redis从DB正确获取到缓存数据,并储存再redis中,然后返回正确的响应到客户端
缓存数据过期,redis重新获取DB缓存数据,并正确反映到客户端
缓存数据的过期时间正常生效,过期时间内,获取缓存数据,没有到DB的请求,过期后,redis没有缓存数据了
如果是删除缓存数据的设计,需要测试缓存数据响应到客户端以后,redit中缓存数据被删除
缓存到达上限,如何处理

2,性能测试
2.1,测试点:
redis停止服务,业务是否正常
redis缓存击穿,大量访问redis中不存在的值,会到DB去查询
redis缓存雪崩,在同一时间大量的缓存过期,对DB造成巨大访问压力
缓存数据到达上限,业务表现是什么,超量淘汰机制
缓存数据出问题时,redis数据能否正确快速回复数据
redis服务断开后回复,业务流程是否正常回复到redis查询

三,Redis怎么测

1,纯基础功能的测试,比如缓存读写的正确性,过期时间等,可以自己搭建本地的redis数据库来测试,不影响其他环境
测试点:
键值对 CRUD:SET写入后GET是否正确,DEL后是否删除;
数据结构操作:Hash 的HSET/HGET、List 的LPUSH/LRANGE、Set 的SADD/SMEMBERS等是否符合预期;
过期时间:设置EX/PX后,TTL是否正确,过期后是否无法读取;
覆盖行为:对已存在的键SET新值,是否覆盖旧值,过期时间是否重置。

2,验证业务系统和redis的集成效果(比如缓存更新逻辑,缓存穿透,缓存雪崩等),需要用专门的测试环境
通常是运维团队搭建,与开发的业务系统配套,规模比较小。
测试时,问开发要连接信息:主机地址,端口,密码,专用于测试的数据库的编号
登录redis: cmd命令:redis-cli -h 主机地址 -p 端口 -a 密码 -n 数据库编号
登录后,使用redis命令来测试

3,UAT环境管理比较严,要注意数据清理,避免批量处理数据,测试完要清理数据,要和运维确认有数据备份

4,自动化测试的话,用python的redis-py库来做

点击查看代码
import redis

# 连接Redis
r = redis.Redis(
    host='redis-test.example.com',
    port=6379,
    password='test123',
    db=1,
    decode_responses=True  # 自动解码为字符串(默认返回bytes)
)

# 执行操作(如测试缓存设置与过期)
r.set('test_key', 'test_value', ex=10)  # 设置10秒过期
print(r.get('test_key'))  # 输出'test_value'
import time
time.sleep(11)
print(r.get('test_key'))  # 输出None(已过期)

没有python环境的话,用shell脚本实现自动化测试redis

点击查看代码
#!/bin/bash

# 1. 配置Redis连接信息(根据实际环境修改)
REDIS_HOST="localhost"
REDIS_PORT=6379
REDIS_PASSWORD=""  # 无密码则留空
REDIS_DB=0
KEY_PREFIX="test_expire_key_"
TOTAL_KEYS=1000
BASE_EXPIRE=10  # 基础过期时间(秒)
CHECK_INTERVAL=3  # 检查间隔(秒)
MAX_CHECKS=6      # 最大检查次数

# 2. 批量创建带过期时间的键
echo "开始创建${TOTAL_KEYS}个带过期时间的键..."
for ((i=0; i<TOTAL_KEYS; i++)); do
    key="${KEY_PREFIX}${i}"
    # 过期时间:10-15秒(随机值)
    expire_seconds=$((BASE_EXPIRE + RANDOM % 6))  # RANDOM%6生成0-5的随机数
    # 执行SET命令(带密码时需加 -a 密码)
    if [ -z "$REDIS_PASSWORD" ]; then
        redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $REDIS_DB SET $key "value_$i" EX $expire_seconds
    else
        redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD -n $REDIS_DB SET $key "value_$i" EX $expire_seconds
    fi
    # 每100个键打印一次进度
    if ((i % 100 == 0)); then
        ttl=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $REDIS_DB TTL $key)
        echo "键 $key 设置成功,过期时间:${expire_seconds}秒,当前剩余TTL:${ttl}秒"
    fi
done

# 3. 定期检查键的过期状态
for ((round=1; round<=MAX_CHECKS; round++)); do
    current_time=$(date +"%H:%M:%S")
    remaining=0
    expired=0
    # 随机抽查100个键(利用$RANDOM生成随机索引)
    for ((s=0; s<100; s++)); do
        i=$((RANDOM % TOTAL_KEYS))  # 生成0到TOTAL_KEYS-1的随机数
        key="${KEY_PREFIX}${i}"
        # 获取TTL
        if [ -z "$REDIS_PASSWORD" ]; then
            ttl=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $REDIS_DB TTL $key)
        else
            ttl=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD -n $REDIS_DB TTL $key)
        fi
        if ((ttl > 0)); then
            ((remaining++))
        else
            ((expired++))
        fi
    done
    echo "[$current_time] 第${round}次检查:抽查100个键,未过期${remaining}个,已过期${expired}个"
    sleep $CHECK_INTERVAL
done

# 4. 清理测试数据
echo "清理测试键..."
for ((i=0; i<TOTAL_KEYS; i++)); do
    key="${KEY_PREFIX}${i}"
    if [ -z "$REDIS_PASSWORD" ]; then
        redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $REDIS_DB DEL $key
    else
        redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD -n $REDIS_DB DEL $key
    fi
done
echo "测试完成"

5,redis可视化结果检查:用redis desktop manager RDM工具来查看

6,redis的性能测试工具 redis-benchmark自带工具,命令是:
(测试100个并发连接,共100000次请求的GET/SET性能)
redis-benchmark -h redis-test.example.com -p 6379 -a test123 -c 100 -n 100000 get set
输出结果会包含QPS,平均响应时间等

posted on 2025-10-22 16:38  二咩rw  阅读(6)  评论(1)    收藏  举报