4. Redis性能测试
如何测试 redis 性能
使用 redis-benchmark 测试 redis 性能 ,有如下参数可以使用
选项 | 描述 | 默认值 |
---|---|---|
-h | 指定服务器主机名 | 127.0.0.1 |
-p | 指定服务器端口 | 6379 |
-s | 指定服务器 socket | |
-c | 指定并发连接数 | 50 |
-n | 指定请求数 | 10000 |
-d | 以字节的形式指定 SET/GET 值的数据大小 | 3 |
-k | 1=keep alive 0=reconnect | 1 |
-r | SET/GET/INCR 使用随机 key, SADD 使用随机值 | |
-P | 通过管道传输 请求 | 1 |
-q | 强制退出 redis。仅显示 query/sec 值 | |
--csv | 以 CSV 格式输出 | |
*-l*(L 的小写字母) | 生成循环,永久执行测试 | |
-t | 仅运行以逗号分隔的测试命令列表。 | |
*-I*(i 的大写字母) | Idle 模式。仅打开 N 个 idle 连接并等待。 |
开始测试
# redis-benchmark -h localhost -p 6379 -c 1000 -n 1000000
可以看到如下打印信息
26.27 秒 完成了 一百万次的请求
1000 个客户端并发
以字节的形式指定设置 3 个字节的数据大小
通过上图我们可以看出,本次 redis 测试的性能,每秒能够处理 38066.23 个请求,对于单机的 redis 已经是相当厉害了
redis 基础知识
redis 默认是有 16 个数据库的,咱们可以查看 redis.conf 文件中有定义
# vim /usr/local/redis/redis-6.2.5/redis.conf
redis 默认是使用第 0 个数据库,咱们可以使用 select
指令来切换数据库
select
可以通过 select
指令来切换数据库
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> DBSIZE
(integer) 0
127.0.0.1:6379[3]> select 0
OK
127.0.0.1:6379> dbsize
(integer) 5
可以看到 0 号数据库是有数据的, 3 号数据库还没有数据
keys
可以通过 keys *
指令来获取当前数据库所有 key , 一般很少用这个命令,因为数据量很大的时候,使用这个命令会很慢
127.0.0.1:6379> keys *
1) "config"
2) "key:__rand_int__"
3) "counter:__rand_int__"
4) "myhash"
5) "name"
flushdb
清空当前数据库的 key 和 value
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
flushall
清空所有数据库的 key 和 value
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> dbsize
(integer) 0
127.0.0.1:6379[2]> set name xiaomotong
OK
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> dbsize
(integer) 0
那么为什么 redis 的默认端口号是 6379 呢?
因为 redis 的作者是一个女明星 MERZ 的粉丝,MERZ 对应到 9 宫格手机键盘上就是 6379
redis 是单线程的
redis 是单线程的,但是不影响他很快,官方表示,redis 是基于内存操作的,CPU 不是 redis 的瓶颈,机器内存和网络带宽才是 redis 的瓶颈。
redis 是 C 语言写的,redis 官方提供的数据为 十万+ QPS
redis 单线程为什么这么快?
1、高性能的服务器一定是多线程的吗?这是一个误区,单线程一样可以非常快
2、多线程的效率一定比单线程的效率高吗?这也是一个误区,多线程会有 CPU 上下文切换,非常耗时
效率比较: CPU > 内存 > 硬盘
redis 核心:
redis 是将所有的数据都放到内存中,所以单线程去操作数据就会非常快,效率就很高,而多线程会出现 CPU 的上下文切换,对于内存而言,没有上下文切换系统效率是最高的