大家好,我们平时测试的应用程序中,应该会大量使用缓存机制来提高程序效率与响应速度,常见的缓存数据库有Redis、Memcached等,如果应用程序中有使用到缓存数据库,那么在测试用例设计以及测试过程中,我们就需要考虑缓存相关的场景,例如操作缓存过期时间使缓存过期、缓存存储的数据是否正确、当缓存读取不到时是否有降级策略等,接下来,给大家介绍一下Redis的使用场景、基本操作以及在测试过程中我们需要关注的点。
一、Redis介绍
Redis 是由C语言编写,完全开源的,一个高性能的 key-value 数据库。
Redis 为了保证效率,数据都是缓存在内存中,Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件中。
二、 Redis使用场景
1、缓存
2、消息队列
3、会话存储
4、计数器
5、实时分析
6、时间线和动态信息流
7、地理位置数据
8、排行榜
三、Redis的优势与劣势
优势:
1、高性能:
Redis 基于内存存储,读写速度快,能够提供高并发访问支持,可用于解决高访问压力下的性能瓶颈。
2、多数据类型支持:
Redis 支持多种数据类型,如字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)和哈希(Hash),可以满足不同场景的需求。
3、持久化:
Redis 提供了多种持久化策略,如 RDB 和 AOF,可以根据需要将数据持久化到磁盘,降低数据丢失的风险。
4、高可用和分布式:
通过 Redis Sentinel 和 Redis Cluster,Redis 可以实现高可用和分布式数据存储,提高系统的可靠性和扩展性。
5、消息发布订阅:
Redis 提供了发布订阅功能,支持消息的实时通信,可以应用于实时消息系统、事件驱动架构等场景。
6、易于使用和丰富的生态系统:
Redis 的命令简单易懂,有丰富的客户端库和开发工具,支持多种编程语言
劣势:
1、内存限制:
由于 Redis 主要基于内存存储,其存储容量受到物理内存的限制。当数据量较大时,可能需要考虑内存成本和内存优化策略。
2、单线程模型:
Redis 使用单线程模型处理请求,虽然在绝大多数情况下性能足够高,但在某些场景下可能无法充分利用多核 CPU 的性能。
4、数据一致性:
Redis 提供了基本的持久化功能,但在某些情况下(如 Redis 挂掉或持久化策略不当时)可能会导致数据丢失。相比于传统的关系型数据库,Redis 的数据一致性相对较弱。
5、在线扩容:
Redis 较难支持在线扩容,在集群容量达到上限时在线扩容比较复杂。
6、主从同步:
Redis 的主从复制采用的是全量复制。
使用redis一般从性能和并发两个方面考虑
1、性能
如图所示,在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
2、并发
如图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。
三、Redis数据类型
Redis 是一个高性能的键值对数据库,支持五种主要的数据类型:字符串(String),列表(List),集合(Set),有序集合(Sorted Set)以及哈希(Hash)。
1、字符串(String)
字符串是 Redis 中最基本的数据类型,可以存储字符串、整数或者浮点数。常用于缓存、计数器等场景。
SET name "John"
GET name
2、列表(List)
列表是由多个字符串元素组成的链表,可以在头部或尾部进行添加、删除等操作。常用于实现队列、堆栈等数据结构。
LPUSH fruits "apple"
RPUSH fruits "banana"
LRANGE fruits 0 -1
3、集合(Set)
集合是无序的、不重复的字符串元素集合,支持添加、删除、检查成员等操作。常用于存储无序的唯一数据。
SADD colors "red"
SADD colors "green"
SMEMBERS colors
4、有序集合(Sorted Set)
有序集合是具有分数(Score)的集合,按照分数进行排序。常用于实现排行榜、时间线等有序数据结构。
ZADD users 100 "Alice"
ZADD users 200 "Bob"
ZRANGE users 0 -1 WITHSCORES
5、哈希(Hash)
哈希是键值对的集合,可以存储多个键值对。常用于存储对象、统计等场景。
HSET user:1 "name" "John"
HSET user:1 "age" "25"
HGETALL user:1
四、Redis常用命令
1、SET/GET:设置/获取字符串键值对
SET name "John"
GET name
2、INCR/DECR:递增/递减整数值
SET counter 0
INCR counter
DECR counter
3、EXPIRE/TTL:设置键的过期时间/查询剩余的过期时间(单位:秒)
SET key "value"
EXPIRE key 60
TTL key
4、LPUSH/RPUSH:从列表的左侧/右侧插入元素
LPUSH fruits "apple"
RPUSH fruits "banana"
5、LPOP/RPOP:从列表的左侧/右侧弹出元素
LPOP fruits
RPOP fruits
6、LRANGE:获取列表中指定范围内的元素
LRANGE fruits 0 -1
7、SADD/SMEMBERS:向集合中添加元素/获取集合中的所有元素
SADD colors "red"
SMEMBERS colors
8、SISMEMBER:检查元素是否存在于集合中
SISMEMBER colors "red"
9、ZADD/ZRANGE:向有序集合中添加元素/获取有序集合中指定范围内的元素
ZADD users 100 "Alice"
ZRANGE users 0 -1
10、HSET/HGET:设置哈希表中的键值对/获取哈希表中指定键的值
HSET user:1 "name" "John"
HGET user:1 "name"
11、HGETALL:获取哈希表中的所有键值对
HGETALL user:1
12、DEL:删除指定的键
DEL key
13、EXISTS:检查指定的键是否存在
EXISTS key
14、KEYS:根据模式获取匹配的键列表
KEYS user:*
五、需要关注的Redis相关测试点
1、功能正确性:
验证涉及 Redis 的功能是否按照预期工作。例如,缓存数据是否正确存储和读取,计数器功能是否正常等。验证从 Redis 中获取的数据与数据库中数据表的内容是否相同,以确保数据的正确性。
2、异常处理:
测试在 Redis 连接失败、超时或其他异常情况下,系统是否能够正常处理。例如,当 Redis 服务不可用时,系统是否会有合适的降级策略,保证功能可用性。模拟 Redis 服务中断的情况,检查是否能够通过数据库查询相关数据,并且能够在应用上正常的显示内容,并提供降级查询方案。
3、性能和延迟:
Redis 通常用于提高系统性能,因此在黑盒测试中需要检查功能的响应时间是否在可接受范围内。可以通过压力测试来验证系统在高并发场景下的性能表现。
4、数据一致性:
验证 Redis 缓存数据与持久化数据源之间的一致性。例如,在更新数据时,确保 Redis 中的缓存数据也得到相应的更新,以保持数据的一致性。
5、数据过期和清理:
检查 Redis 中的数据是否按照预期进行过期和清理。例如,验证数据的 TTL 设置是否正确,以及过期数据是否被自动清除。
6、容量规划:
在测试过程中,关注 Redis 的内存使用情况,以确保实际使用的资源不会超出预期。可以通过监控 Redis 服务器的内存使用情况来验证。查看占用Redis的存储资源大小,可以评估该Redis最大支持的数据量,设定阈值,及时扩容,确保使用资源不会超出预期。
7、安全性:
验证涉及 Redis 的功能是否满足安全要求,例如验证访问控制、数据加密等方面的要求。验证访问 Redis 的权限控制是否合适,数据在传输和存储过程中是否被加密,以保护用户隐私和数据安全,Redis中存储的用户手机号和用户身份证号是否被正确加密。
在黑盒测试中,并不会直接测试 Redis 本身,而是关注 Redis 如何影响到系统的功能、性能和可用性。