当前位置:首页 > 问答 > 正文

Redis测试用命令都在这,帮你快速搞定各种场景问题

想玩转Redis测试,你得先有个Redis环境,最简单的方法就是用Docker拉一个起来,这是很多人在知乎上推荐的方式,因为干净又方便,命令大概是这样的:docker run -d --name my-redis -p 6379:6379 redis,这条命令会在后台运行一个名为my-redis的容器,并把它的6379端口映射到你本机的6379端口,环境准备好了,我们就可以开始各种场景的测试了。

基础操作测试:就像在玩一个高级字典

Redis最基本的就是这五种数据类型:字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)和哈希(Hash),测试它们,就用最经典的“增删改查”套路。

  1. 字符串(String): 这是最简单的类型,可以存数字、文本甚至图片序列化后的东西,测试命令比如:

    • SET mykey "Hello Redis" - 这就像往一个叫“mykey”的盒子里放进“Hello Redis”这个内容。
    • GET mykey - 这是把“mykey”盒子里的东西再拿出来看看,应该会返回"Hello Redis"。
    • INCR counter - 如果一个键存的是数字,这个命令能让数字自己加1,非常适合用来做文章阅读量、用户点赞数的测试。
    • DEL mykey - 测试删除功能,把“mykey”这个盒子整个扔掉。
  2. 列表(List): 像一个排队队伍,数据一个接一个,可以从左边或右边放进放出。

    • LPUSH mylist "world" - 从队伍左边插进一个“world”。
    • RPUSH mylist "hello" - 从队伍右边插进一个“hello”。
    • LRANGE mylist 0 -1 - 查看整个队伍,从第0个到最后一个,这时候你可能会看到队伍是 "world" "hello"。
    • LPOP mylist - 从队伍左边弹出一个成员,就像队伍第一个人办完事离开了。
  3. 集合(Set): 像一个不允许有重复成员的俱乐部,而且成员进来顺序是乱的。

    • SADD myset "apple" "banana" "apple" - 尝试往俱乐部里加“apple”、“banana”和又一个“apple”,因为不能重复,最后俱乐部里只有“apple”和“banana”两个成员。
    • SMEMBERS myset - 查看俱乐部所有成员,但顺序是不确定的。
    • SISMEMBER myset "apple" - 检查“apple”是不是俱乐部的成员,返回1表示是,0表示不是。
  4. 哈希(Hash): 像一个档案袋,里面装着一个对象的多条信息,比如一个用户的姓名、年龄、城市。

    • HSET user:1000 name "张三" age 30 city "北京" - 给编号1000的用户建立一个档案袋,里面记录了名字、年龄和城市。
    • HGET user:1000 name - 单独查看1000号用户的姓名。
    • HGETALL user:1000 - 把1000号用户的整个档案袋内容都拿出来看。
  5. 有序集合(Sorted Set): 和集合类似,但每个成员都有一个分数(score),队伍按分数从小到大排队,常用于排行榜。

    • ZADD leaderboard 100 "player1" 200 "player2" - 给玩家设置分数,加入到排行榜。
    • ZRANGE leaderboard 0 -1 WITHSCORES - 按分数从低到高查看排行榜及其分数。
    • ZREVRANGE leaderboard 0 -1 WITHSCORES - 按分数从高到低查看,这才是常见的排行榜样子。

生命周期测试:给数据设定一个“保质期”

Redis测试用命令都在这,帮你快速搞定各种场景问题

Redis一个很有用的功能是可以给数据设置过期时间,时间一到,数据自动删除,这在验证码缓存、会话保持等场景非常有用,测试这个功能主要用两个命令:

  • SETEX mycode 60 "123456" - 这个命令是合二为一,设置一个键mycode,值为123456,并且过期时间是60秒,60秒后,这个键会自动消失。
  • 另一种方式是先SET mycode "123456",然后EXPIRE mycode 60
  • 你可以用TTL mycode来查看这个键还剩下多少秒“寿命”,如果返回-2表示键已经不存在了,返回-1表示键没有设置过期时间。

性能与压力测试:看看Redis到底有多能扛

当你想知道你的Redis服务器性能如何,能承受多大的访问压力时,就需要进行性能测试,Redis官方自带了一个非常强大的压力测试工具,叫redis-benchmark,这个工具可以直接在命令行里使用,它会模拟很多个客户端同时向Redis发送命令,然后统计处理速度。

  • redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000 这条命令的意思是:连接本地的6379端口Redis,模拟100个客户端同时连接,一共发送10万次请求,它会测试各种命令的每秒处理次数(QPS),让你对Redis的性能有个直观的了解,很多技术博客在介绍性能调优时都会提到这个工具。

持久化测试:模拟断电,数据会丢吗?

Redis的数据是放在内存里的,如果服务器突然断电,内存里的数据就全没了,所以Redis提供了持久化机制,可以把内存数据保存到硬盘上,主要有两种方式:RDB(快照)和AOF(日志),测试持久化,就是模拟Redis正常关闭和非正常关闭后,重启时数据能否恢复。

Redis测试用命令都在这,帮你快速搞定各种场景问题

  • 你可以先写入一些数据,然后执行SAVE命令(会阻塞所有请求,生产环境慎用)或BGSAVE命令(后台执行),手动创建一个RDB快照。
  • 然后你重启Redis服务,再检查之前的数据是否还在。
  • 对于AOF,你可以在配置文件里开启它,然后进行一些写操作,观察AOF文件内容的变化,接着模拟宕机,再重启Redis,看通过AOF日志是否能完整恢复数据。

事务与管道测试:批量操作的效率

事务(Multi/Exec)能保证一批命令原子性执行,中间不会被其他命令打断,管道(Pipeline)则能将多个命令打包一次发送,大大减少网络往返时间,提升效率,测试时:

  • 对于事务,你可以用MULTI开始,然后输入一系列命令,最后用EXEC执行,可以故意在事务中模拟一个错误,看看其他命令是否还会执行。
  • 对于管道,你可以写一个简单脚本,比如用Python的redis库,一次性发送一万次SET命令,对比一下使用管道和不使用管道所花费的时间差异,你会明显感受到管道带来的性能提升。

高级特性与故障模拟测试

这部分稍微深入一点,比如测试主从复制:搭建一个主节点(Master)和几个从节点(Slave),然后在主节点上写数据,看看从节点是否能几乎实时地同步过去,还可以模拟主节点宕机,然后手动将一个从节点提升为新的主节点(故障转移),测试系统的可用性。

Redis的Pub/Sub(发布/订阅)功能也值得测试,就像是一个简单的消息系统,你可以用一个客户端SUBSCRIBE news订阅“news”频道,然后用另一个客户端PUBLISH news "hello everyone"发布消息,看第一个客户端是否能立刻收到。

别忘了清理现场,测试完成后,如果想清空当前数据库的所有数据,可以用FLUSHDB命令;如果想清空整个Redis服务器(所有数据库)的数据,可以用FLUSHALL命令,这两个命令非常危险,在生产环境下绝对不能用,但在测试环境就非常方便。

就是一些常见的Redis测试场景和对应的命令,实际测试时,你可以根据自己的业务需求,把这些基础命令像搭积木一样组合起来,创造出更复杂的测试用例,从而确保你的Redis应用稳定可靠。