前言
最近公司用到Redis作为中间件,但是使用Redis作为中间件的时候,有的时候比较难定位到问题具体在什么地方,所以有的时候需要临时的给Redis一些压力,这样能比较快速的复现问题,于是就是使用了Redis自带的测试工具来做相关测试。
关于redis-benchmark
Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]
-h <hostname> # redis服务地址 (default 127.0.0.1)
-p <port> # redis服务的端口 (default 6379)
-s <socket> # 服务器的socket (overrides host and port)
-a <password> # 数据库密码
-c <clients> # 并发链接的客户端数量 (default 50)
-n <requests> # 请求的总数 (default 100000)
-d <size> # 单个数据包的大小 (单位是bytes,默认是2)
--dbnum <db> # 执行默认的数据库 (default 0)
-k <boolean> #客户端是否使用keepalive,1为使用,0为不使用,默认值为1
-r <keyspacelen> # key的长度;SET/GET/INCR 使用随机 key, SADD 使用随机值。使用-r的话可以生成更多的key
-P <numreq> # 通过管道请求的数量 Default 1 (no pipeline).
-q # 强制退出 redis。仅显示 query/sec 值
--csv # 以 CSV 格式输出
-l # 循环执行,永久执行测试
-t <tests> # 仅运行以逗号分隔的测试命令列表。如果不指定会依次压测多个命令(get,set,incr,lpush)结果
-I # Idle 模式。仅打开 N 个 idle 连接并等待。
可以用于压力测试,也可以用于快速造数据。
一些命令
切换库
SELECT DB_NUMBER # 切换数据库的命令
清空本库
> SELECT 1 # 切换到DB 1
> FLUSHDB # 删除DB 1 的所有数据
清空Redis
> FLUSHALL # 删除redis中的所有数据
碎片整理(数据删除,内存没释放问题)
Redis有自己的内存分配器,当数据删除后,释放的内存空间由Redis自己的内存分配器管理,并没有立即将内存返回给操作系统,所以对于操作系统而言,仍然认为Redis占用了内存。这样的好处是,减少Redis向系统申请内存分配的次数,提升Redis自身性能。
redis-cli memory purge # 手动清零碎片,释放内存
使用实列
redis-benchmark -t set --dbnum 1 -c 10 -d 1024 -n 300000 -r 500000 -P 10
在1号数据库上,使用10个客户端连接去发送300000个大小为1024字节(1kb)的数据包,这300000个数据包的key从500000以下随机产生,通过管道请求的数据量为10。