Redis基础
Redis 入门
概述
Remote Dictionary Server
数据类型:字符串 链表 集合 有序集合 哈希表。BitMap、 Hyperlog Log(大数据量的去重)、Geospatial(地理位置相关)
NoSQL
Not only SQL/non relational:非关系型数据库。目的解决多重数据类型和高并发问题。
- KV数据库 redis
- 列存储数据库 关系型数据库采用行存储在存储上是连续空间,不适用于海量数据。按列存储可以实现分布式存储,适合海量数据,如HBase.
- 文档型数据库 NoSQL与关系型数据库的结合。如:MongoDb
- 图像数据库 存储一个节点关系的数据库, 如:Neo4j
用途
- 数据缓存
- 实时同步数据:要求缓存和DB中的数据保持一致
- 阶段性同步数据: 没有必要与DB中的数据实时保持一致。 可以为缓存数据添加缓存时长
特点
- 性能极高
11w/s read; 8w/s write。
- 基于内存
- 基于C开发
- 源码十分精细
- 简单稳定 源码很少
- 持久化 保证数据的安全性。 RDB、AOF两种方式
- 高可用集群 保证系统的安全性
- 丰富的数据类型
- 强大功能 数据淘汰、发布订阅、事务、Lua扩展。
- 客户端语言广泛 提供了简单的TCP通信协议,方便各种变成语言开发客户端。
- 支持ACL权限控制 redis6之后支持ACL(Access Control List),可以为不同用户定制不同的权限。
- 支持多线程IO模型 6.0之后支持多线程IO
IO模型
-
单线程模型
不同的连接会注册多种时间到事件处理器, 当socket上有事件就绪时,任务被塞到任务队列, 等待主线程从任务队列中取出执行。 这些事件除了socket建立和关闭连接这些需要操作文件的请求外, 一旦连接建立大多数是一些redis命令的执行, 而这些命令是直接操纵内存,所以执行速度很快。 同时避免了多线程带来的指令执行顺序,数据竞争的问题。
-
混合线程模型
混合线程模型值得是, 对于一些与客户端关系不大的任务, 例如执行持久化的操作, 这类任务交给主线程fork出来的子线程执行, 执行完毕后销毁。 这里的多线程是指多线程处理redis内部的一些任务, 不是多线程处理客户端请求的。
-
多线程模型
已知内存响应时长100ns, 若是主线程执行的多有操作均为内存操作,那么理论上 1kw/s, 而实际上redis可以达到 10w/s量级。 这部分损耗, 有部分是来自从socket上读取数据并拷贝到用户态,对于IO这部分操作, 在多线程模型中交给了若干IO线程执行。而对于如何均衡客户端请求到 不同的事件分发器-IO线程上, 采用了轮询。
如何保证多线程下往任务队列中push的顺序和请求的顺序一致?
-
IO模型优缺点
单线程: 可维护性高,单线程不存在并发读写和线程切换的消耗(几十ns); 缺点:不能利用多核的优势,同时一个线程处理多个IO也存在一定性能问题
多线程模型: 集合多线程IO和单线程执行命令的优势;
多路复用
redis采用epoll多路复用,对于单线程模型而言是事件就绪后往任务队列塞事件,对于多线程模型而言是事件就绪后往IO线程塞任务。
@TODO:多路复用待补充
Redis 安装启动
安装
install之后的bin文件
- redis-check-aof, redis-check-rdb 用于持久化
- redis-cli 客户端
- redis-server 服务端
- redis-sentinel 搭建集群使用
启动
redis-server: 使用默认配置 redis-server /path/redis.conf : 使用指定的配置文件启动
停止
redis-cli shutdown
也可以通过具有权限的客户端执行 shutdown命令
连接
redis-cli 本地连接
redis-cli -h ip -p port
auth 验证
配置
- bind 绑定客户端IP 配置可以监听哪些IP来源的客户端
- protected-mode 保护模式开启的情况下,若默认用户没有配置密码则只支持本机连接。
- requirepass 用户密码, 默认是不设置的。 所以初始情况下 redis-cli 是可以直接访问的。设置密码后通过’auth’命令验证。
- rename-command
重命名命令,通过这种方式可以禁用某些危险命令.
rename-command flushall "" # 禁用 rename-command flushdb "manager_flush_db" # 重命名为自己得知的命令 manager_flush_db
客户端
- 命令行
- 图形客户端 redis plus; redis desktop
- API
配置文件详情
INCLUDES
可以使用 include 包含其他配置文件, 被包含的文件会替代由上到下替代原配置。 例如可以在文件头部包含一个模板配置, 然后将自定义配置放在下面实现差异化。 或是include放在文件尾部, 替换原文件内容。
# include /path/to/local.conf
# include /path/to/other.conf
# include /path/to/fragments/*.conf
NETWORK
-
bind
-
protected-mode
-
port
-
tcp-backlog 应对高并发系统的慢连接,设置的一个TCP连接队列。Linux2.2版本之前,该队列存放的是完成TCP第一次握手的客户端连接, 2.2版本之后区分为两个队列,SYN_RECEIVED(未完成三次握手的客户端) ESTABILISHED(完成三次握手的客户端)。 由于linux内核中也有这个选项的配置
/proc/sys/net/core/somaxconn
, 所以 linux最终会两者配置的最小值。In high requests-per-second environments you need a high backlog in order to avoid slow clients connection issues. Note that the Linux kernel will silently truncate it to the value of /proc/sys/net/core/somaxconn so make sure to raise both the value of somaxconn and tcp_max_syn_backlog in order to get the desired effect.
查看linux内核
cat /proc/version
uname -a
如何修改linux内核这一参数,
- 在
/etc/sysctl.conf
文件中, 添加选项net.core.somaxconn=2014
, - 然后执行
sysctl -p
加载新的配置
- 在
-
timeout 客户端与服务端连接后经过timeout时间无操作后则关闭连接。
-
tcp-keepalive 配置种的解释原文如下:
If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence of communication. This is useful for two reasons:
- Detect dead peers.
- Force network equipment in the middle to consider the connection to be > alive.
On Linux, the specified value (in seconds) is the period used to send ACKs. Note that to close the connection the double of the time is needed. On other kernels the period depends on the kernel configuration.
用于客户端失活检测,若是两次ACK之后客户端没有响应,则断开连接; 用于强制保持连接,每个一段时间与客户端通信一次。
GENERAL
- daemonize 是否以daemon模型运行
- pidfile 记录redis server 运行进程的PID号的文件位置
- loglevel
日志级别。
Specify the server verbosity level. This can be one of: debug (a lot of information, useful for development/testing) verbose (many rarely useful info, but not a mess like the debug level) notice (moderately verbose, what you want in production probably) warning (only very important / critical messages are logged)
- logfile 日志输出文件路径,"" 空表示输出到标准输出, daemon模式默认输出到 /dev/null
- databases 设置数据库个数,默认使用0号数据库。使用SELECT 命令也可以指定数据库
SECURITY
- requirepass 数据库密码
CLIENTS
- maxclients
允许的客户端最大数量,因为redis自身占用32个,实际为设置值-32.但是不能操作linux自身设置的可打开的最大fd.
ulimit -n
可查看linux 可打开的最大fd数. 在集群模式下,每个节点会额外占用2个fd,进行通信。
MEMORY MANAGEMENT
- maxmemory
redis 允许使用的最大字节数。达到内存限制时的移除策略如下:
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory # is reached. You can select one from the following behaviors: # # volatile-lru -> Evict using approximated LRU, only keys with an expire set. # allkeys-lru -> Evict any key using approximated LRU. # volatile-lfu -> Evict using approximated LFU, only keys with an expire set. # allkeys-lfu -> Evict any key using approximated LFU. # volatile-random -> Remove a random key having an expire set. # allkeys-random -> Remove a random key, any key. # volatile-ttl -> Remove the key with the nearest expire time (minor TTL) # noeviction -> Don't evict anything, just return an error on write operations.
- LRU
- LFU
- 随机
- 最接近过期的key
- 不淘汰
- maxmemory-policy 淘汰策略。需要说明的时LRU LFU TTL这几种方式都是近似统计,是通过采样指定数量的key进行统计,删除其中之一。
- maxmemory-samples
淘汰策略执行时采样点数。默认是5。注意样本的选取算法是LRU,具体怎么淘汰取决于maxmemory-policy
# The default of 5 produces good enough results. 10 Approximates very closely # true LRU but costs more CPU. 3 is faster but not very accurate.
- maxmemory-eviction-tenacity
容忍度,选定要淘汰的key时,何时删除? 值越低,删除越及时。
0 = minimum latency, 10 = default, 100 = process without regard to latency
THREADED I/O
- io-threads redis6.0开始支持IO多线程,该项设置用于设置线程数。
- io-threads-do-reads
默认情况下,多线程下额外的线程只用于处理写请求,设置此配置项可以处理读请求。
Usually threading reads doesn't help much.
SNAPSHOTTING
-
save redis快照条件设置
Unless specified otherwise, by default Redis will save the DB: After 3600 seconds (an hour) if at least 1 change was performed After 300 seconds (5 minutes) if at least 100 changes were performed After 60 seconds if at least 10000 changes were performed
You can set these explicitly by uncommenting the following line. save 3600 1 300 100 60 10000
Redis命令
基础命令
- ping 心跳返回 PONG,表明客户端与服务器正常连接。
- select index 切换数据库
- dbsize 查看当前数据库有多少key
- flush 删除当前数据库内容
- flushall 删除所有数据库内容
- quit/exit 客户端退出
- shutdown 关闭redis服务
key操作命令
- keys pattern 查找符合指定模式的所有key。不推荐使用,会阻塞服务,使用scan替代
- EXISTS key 检查指定key是否存在
- del key1 key2 删除指定key
- rename old_key new_key key重命名
- move key db 将指定key移动到指定db
- type key 返回指定key所存储的数据类型. none(不存在),string,list,set,zset,hash
- expire key seconds 设置key的过期时间. pexpire key millisecond
- ttl key 查看key的过期时间。 -1:不过期, -2:key不存在 pttl 返回毫秒数
- persist key 将指定key变为支持key, 去除过期时间
- randomkey 从数据库中随机返回一个key
- scan
scan cursor [MATCH pattern] [COUNT count] [TYPE type]
从指定的游标开始删选指定pattern和指定value类型的count个key 相似的命令:- hscan hash类型的scan
hscan key cousor [MATCH pattern] [COUNT count]
- sscan set类型的scan
- zscan zset类型scan
- hscan hash类型的scan
Value 操作命令
string
常用命令
string value类型的最大为512M.
-
set
set key value
:设置key的值为valueset key value nx
: 限制只有当key不存在时才能设置成功,相当于添加新的keyset key value xx
: 限制只有当key存在时才能设置成功,相当于修改已有keyset key value ex seconds
: 设置过期秒数set key value ex milliseconds
: 设置过期的毫秒数 -
setex
setex key seconds value
: 设置value的同时设置过期秒数 相似的还有: psetex, 毫秒过期时间 -
setnx 只有当key不存在时才能设置成功
-
getset
getset key value
: 先获取原值在进行设置 -
mset
mset key value [key value]
: 同时设置多个kv对 -
msetnx 同时设置多个不存在的kv, 有一个key是已经存在的化,整体执行都不会成功。
-
get/mget
-
append
append key value
: 在类型为字符串的value后追加内容,返回新value的长度。 -
incr/decr
incr key
: 对于可转换为int类型的value值自增,返回新值decr key
: 自减 -
incrby/decrby
incrby key increment
: 指定自增步长,返回新value的长度。 -
incrbyfloat 操作浮点型数据增加指定大小。无decrbyfloat
-
getrange
getrange key start end
: 获取指定key的截取内容。 -
setrange
setrange key offset value
: 修改部分内容, offset超出长度时会进行空字符填充。 -
strlen
strlen key
: 获取指定key的长度
应用场景
- 数据缓存
- 计数器 例如视频播放次数,客户端访问一次就形式修改,然后以异步方式持久化到其他数据源。
- 共享session 分布式系统中。例如需要验证的时候,登陆服务其可能存有用户session,但是例如支付服务器不会存储用户session,这就会引起重新验证。可以将session放到共享redis,需要验证的场景首先会查询redis有无该用户的session,不存在时再进行验证。
- 限速器
例如限制某个IP访问次数, expire + incr 实现。
$(set ip 1 ex 60 nx) != nil || $(incr ip 1) < x
hash
hash表。
常用命令
- hset/hmset
hset key field value [feild value]
: 给指定key的一个或多个feild赋值 - hget/hmget
hget key feild
: 获取指定key的feild字段valuehmget key feild [feild]
: 一次获取多个feild的value - hgetall
hgetall key
: 获取key的多有feild value字段信息 - hkeys
hkeys key
: 获取指定key的所有feild信息 - hvals
hvals key
: 捉去hash表所有feild的value信息 - hdel
hdel key feild [feild]
: 删除hash表的指定feild - hexists
hexists key feild
: 检查指定hash表的feild字段是否存在 - hincrby/hincrbyfloat
hincrby key feild increment
: 对指定hash表的feild字段进行加减 - hstrlen
hstrlen ket feild
: 获取hash表feild字段value值长度 - hlen
hlen key
: 获取hash表所有feild数目
应用场景
适合存储对象数据,key为对象名称,value为描述对象属性的字典。
list
列表,底层为双向链表。头尾插入效率高于中间插入。
常用命令
- lpush/rpush
lpush key element [element]
: 在列表头部/尾部插入元素 - lpushx/rpushx 在列表头部/尾部插入元素, 指定的列表必须存在。
- lrange
lrange key start stop
: 获取列表指定范围内的元素 - lindex
lindex key index
: 查看指定下表的元素,index也可以为负数 - lset
lset key index element
: 修改指定位置的值,越界则失败 - linsert
linsert key BEFORE|AFTER pivot element
: 在指定的基准元素前后插入元素 - lpop/rpop
lpop key count
: 在列表头部或尾部弹出count个元素 - llen
llen key
: 获取列表的长度 - blpop/brpop
blpop key [key] timeout
: 指定多个hash表进行pop, 若是范围内hash表无元素导致pop等待,等待超时为timeout - rpoplpush/brpoplpush
rpoplpush source destination
: 从指定的spurce列表中rpop出一个元素(非nil),插入到destination中(不存在则创建)。返回弹出元素。 brpoplpush 是带有timeout的阻塞版本。 - lrem
lrem key count element
: 从列表中删除count个element元素,count也可以为负数,表示反方向删除。 - ltrim
ltrim key start stop
: 根据start,stop对原列表进行截取
应用场景
- 栈 lpush+lpop 可以实现栈逻辑
- 队列 lpush+rpop
- 阻塞式消息队列 lpush+brpop, 生产者通过lpush产生元素,消费者阻塞式的bpop获取元素
- 动态有限集合 lpush + ltrim, 动态保证列表始终为指定大小。 lpush 实现元素入栈, ltrim实现指定方向截取。
Set
底层为hash实现,无序。
常用命令
- sadd
sadd key member [member]
: 向指定集合中添加元素 - smembers
smembers key
:返回集合中的所有元素 - scard
scard key
: 获取集合长度 - sismember
sismember key member
: 判断member是否是集合中的元素 - smove
smove source destination member
:将source集合中的member移动到destination集合中,不存在该集合则创建 - srem
srem key member [member]
: 删除指定元素 - srandmember
srandmember key count
: 从指定集合中随机返回count个元素。当count为负数时,去绝对值,但是此时可能会有重复值。 - spop
spop key count
: 从集合中随机弹出 count个元素 - sdiff
sdiff key [key]
: 求集合的差集.按照key顺序计算 - sdiffstore
sdiffstore destination key [key]
: 求集合差集,并将集合保存到destination集合 - sinter/sinterstore
sinter key [key]
:求集合交集 - sunion/sunionstore
sunion key [key]
:求集合的并集
应用场景
- 动态集合 例如:动态黑白名单
- 有限随机数 在指定集合中随机返回指定数目的元素
- 用户画像 用户特征化的标签适合使用无序,不重复的集合存储。 并在,通过集合运算(画像特征原酸)实现好友推荐、购物推荐等
Zset
有序集合,集合元素为字符串,每个元素对应一个score,按照score进行排序,score相同按照key字母序排列。
常用命令
-
zadd
zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member]
:zadd key score member [score member]
: zadd collage 10 hit 100 ahuzadd key nx score member
:nx 表示只有当member不在集合中时才能添加成功,相当于新增。xx表示存在,相当于更新 -
zrange
zrange key start stop [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
- WITHSCORES: 同时返回元素对应的score
例如.:
zrange collage 0 -1 WITHSCORES
:输出结果为
1) "qh" 2) "1" 3) "hd" 4) "2" 5) "bd" 6) "3" 7) "rd" 8) "11"
- BYSCORE: 按照score筛选,此时的start stop表示score的区间,
zrange zset 1 (3 BYSCORE
:获取集合中score在[1,3)区间内的所有元素,qh、hd - BYLEX: 按照字母序删选,此时的start,stop表示字母序区间,
zrange zset (c (r bylex
仅适用于zset中score都相同的情况 - REV: 逆序输出
- LIMIT offset count: 配合by语句使用,对筛选后的集合按照起始位置和输出个数进行输出
zrange zset 1 (5 BYSCORE 1 2
:获取集合中score在[1,5)区间内的所有元素,按照offset从1开始,输出2个元素。
- WITHSCORES: 同时返回元素对应的score
例如.:
-
zrangebylex 相当于
zrange key start stop BYLEX
, ‘-’:表示字符的负无穷,’+’: 表示字符的正无穷 -
zrangebyscore 相当于
zrange key start stop BYSCORE
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
: 按照指定的分数区间进行格式输出 (min 表示开区间, inf表示无穷 -
zcard
zcard key
: 返回集合中元素个数 -
zcount
zcount key min max
: 统计指定score区间的元素个数 -
zscore
zscore key member
: 获取集合中指定member的score值 -
zrank/zrevrank
zrank key member
: 获取集合中指定member的排名(索引值从0开始) -
zincrby
zincrby key increment member
: 给指定元素的score进行增减increment -
zrem
zrem key member [member]
:移除指定元素 -
zremrangebyrank
zremrangebyrank key start stop
: 移除指定索引范围内的元素 -
zremrangebyscore
zremrangebyscore key min max
: 移除指定score范围内的元素 -
zlexcount
zlexcount key min max
:对于集合中所有score相同的情况下,统计指定字母序范围内的元素数。 -
zremrangebylex
zremrangebylex key min max
:对于集合中所有score相同的情况下,移除指定字母序范围内的元素
应用场景
- 排行榜
bitmap
本质是只包含0/1值的字符串。
常用命令
- setbit
setbit key offset value
: 指定为设为value值。当offset超出当前长度时会进行自动伸展,空白位0填充,对于较长的伸展过程,由于内存分配和拷贝,可能会阻塞服务。 所以,更可行的是在一开始就设置一个较大的offset. - getbit
getbit key offset
: 获取指定位的值 - bitcount
bitcount key [start end [BYTE | BIT]]
: 获取指定key所有(指定起始位置)2进制位不为0的总数。 - bitpos
bitpos key bit [start [end [BYTE|BIT]]]
: 在指定范围内获取第一个指定bit值的位置,bitpos has_val 1 0 60
获取has_val中[0-60]bit中第一个值位1的下标。 - bitop
bitop operation destkey key [key ...]
: 在指定的key范围内进行operator(AND,OR,NOT,XOR)位运算,将结果保存到destkey
应用场景
- 大数据量的二值统计
HyperLogLog
基数计数概率算法,以极小内存完成独立总数的统计。可以认为是一个元素为string类型的set.
常用命令
- pfadd
pfadd key [element]
: 将指定的key添加到set中 - pfcount
pfcount key [key ...]
: 获取近似有多少个独立key,当参数为多个是返回的是多个key并集的近似独立key - pfmerge
pfmerge destkey sourcekey [sourcekey ...]
:将多个sourcekey合并为一个,结果存入destkey
应用场景
- 对数据量较大的日志数据做不精确的去重, 不精确成都为0.81%.
Geospatial
redis3.2 引入的数据结构,用于表达地理空间,本质为集合,集合元素由三部分信息构成:longitude经度[-180,180]、latitude[-90,90]纬度、位置名称。
常用命令
- geoadd
geoadd key [NX|XX] [CH] longitude latitude member [longitude latitude member]
: 向指定key中添加一个member,信息为(longitude latitude member) - geopos
geopos key member [member ...]
: 获取指定成员的地址信息 - geodist
geodist key member1 member2 [M|KM|FT|MI]
: 获取两个成员间距 - georadius
georadius key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]
: 获取距离指定位置半径距离在指定范围内的member信息。- WITHCOORD : 带上筛选出来的member的经纬度信息
- WITHDIST: 带上距离信息
- WITHHASH: 带上地理位置的hash串
- COUNT: 指定有限个结果
- ASC|DESC: 输出结果按照升序/降序
应用场景
- 地理位置相关的计算
发布订阅
订阅
- subscribe
subscribe channel [channel ...]
: 订阅指定的channel,订阅后出于阻塞状态,等待指定channel发布消息
127.0.0.1:6379> SUBSCRIBE event
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "event"
3) (integer) 1
1) "message"
2) "event"
3) "test"
-
psubscribe
psubscribe pattern [pattern]
: 订阅指定的pattern,只支持’*‘通配符. -
unsubscribe/punsubscribe
unsubscribe [channel]
: 取消订阅
发布
- publish
publish channel message
:向指定channel发布消息
查看订阅发布系统内部状态的命令 pubsub
-
pubsub channel
PUBSUB CHANNELS [pattern]
: 查看当前发布订阅系统符合条件的处于活跃状态的channel -
pubsub numsub
PUBSUB NUMSUB [channel]
: 返回指定channel的订阅者数量(不包含psubscribe方式订阅的pattern) -
pubsub nunpat
PUBSUB NUMPAT
: 返回所有pattern的订阅者数量
事务
所谓redis事务,就是批量的不被中断的执行一批命令。
事务相关命令
- MULTI: 开启事务
开启事务之后, 提交的命令会被放入队列,返回QUEUED,表示放入队列成功。
127.0.0.1:6379> MULTI OK 127.0.0.1:6379(TX)> set age 20 QUEUED 127.0.0.1:6379(TX)> incr age QUEUED 127.0.0.1:6379(TX)> EXEC 1) OK 2) (integer) 21
- EXEC: 提交事务
- DISCARD: 放弃事务,未执行提交之前可以放弃事务。
- WATCH:
WATCH key [key ...]
乐观锁,观察指定的建,防止在某客户端执行期间,操作的数据被其他地方修改。若是提交事务之后,所监控的键被修改,则整个事务执行失败,返回nil
redis事务的几点说明
- 命令格式错误,提交到队列失败,整个事务都不会执行
- 提交到队列成功,但是某个命令执行失败,则只影响失败的命令。并不存在回滚。
- 相比与DBMS的ACID,具备一致性,是否具备持久化特性取决于redis持久化配置。隔离机制则是通过乐观锁实现。
benchmark
benchmark 说明
redis-benchmark –help
Usage: redis-benchmark [OPTIONS] [COMMAND ARGS...]
Options:
-h <hostname> Server hostname (default 127.0.0.1)
-p <port> Server port (default 6379)
-s <socket> Server socket (overrides host and port)
-a <password> Password for Redis Auth
--user <username> Used to send ACL style 'AUTH username pass'. Needs -a.
-u <uri> Server URI.
-c <clients> Number of parallel connections (default 50)
-n <requests> Total number of requests (default 100000)
-d <size> Data size of SET/GET value in bytes (default 3)
--dbnum <db> SELECT the specified db number (default 0)
-3 Start session in RESP3 protocol mode.
--threads <num> Enable multi-thread mode.
--cluster Enable cluster mode.
If the command is supplied on the command line in cluster
mode, the key must contain "{tag}". Otherwise, the
command will not be sent to the right cluster node.
--enable-tracking Send CLIENT TRACKING on before starting benchmark.
-k <boolean> 1=keep alive 0=reconnect (default 1)
-r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD,
random members and scores for ZADD.
Using this option the benchmark will expand the string
__rand_int__ inside an argument with a 12 digits number in
the specified range from 0 to keyspacelen-1. The
substitution changes every time a command is executed.
Default tests use this to hit random keys in the specified
range.
Note: If -r is omitted, all commands in a benchmark will
use the same key.
-P <numreq> Pipeline <numreq> requests. Default 1 (no pipeline).
-q Quiet. Just show query/sec values
--precision Number of decimal places to display in latency output (default 0)
--csv Output in CSV format
-l Loop. Run the tests forever
-t <tests> Only run the comma separated list of tests. The test
names are the same as the ones produced as output.
The -t option is ignored if a specific command is supplied
on the command line.
-I Idle mode. Just open N idle connections and wait.
-x Read last argument from STDIN.
--help Output this help and exit.
--version Output version and exit.
Examples:
Run the benchmark with the default configuration against 127.0.0.1:6379:
$ redis-benchmark
Use 20 parallel clients, for a total of 100k requests, against 192.168.1.1:
$ redis-benchmark -h 192.168.1.1 -p 6379 -n 100000 -c 20
Fill 127.0.0.1:6379 with about 1 million keys only using the SET test:
$ redis-benchmark -t set -n 1000000 -r 100000000
Benchmark 127.0.0.1:6379 for a few commands producing CSV output:
$ redis-benchmark -t ping,set,get -n 100000 --csv
Benchmark a specific command line:
$ redis-benchmark -r 10000 -n 10000 eval 'return redis.call("ping")' 0
Fill a list with 10000 random elements:
$ redis-benchmark -r 10000 -n 10000 lpush mylist __rand_int__
On user specified command lines __rand_int__ is replaced with a random integer
with a range of values selected by the -r option.
常用如: -t 指定测试命令 redis-benchmark -c 1 -n 1000 -a xx -t hset
redis-benchmark -c 1 -n 1000 hget myhash __rand__int__
: hget已有数据myhash. command 是命令行可执行时忽略-t
benchmark结果
每个命令的测试结果分为一下几个部分:
-
环境信息
====== HSET ====== 1000 requests completed in 0.02 seconds # 完成指定请求数花费的时间 10 parallel clients # 并行的客户端数量 -c 参数指定 3 bytes payload # 每个请求的数据包大小 -d 参数指定 keep alive: 1 # TCP连接类型 -k 指定 host configuration "save": 3600 1 300 100 60 10000 # 持久化策略 host configuration "appendonly": no multi-thread: no # 是否设置了IO多线程 --threads 指定
-
延迟百分比
Latency by percentile distribution: 0.000% <= 0.039 milliseconds (cumulative count 2) 50.000% <= 0.095 milliseconds (cumulative count 554) 75.000% <= 0.135 milliseconds (cumulative count 780) 87.500% <= 0.159 milliseconds (cumulative count 888) 93.750% <= 0.191 milliseconds (cumulative count 939) 96.875% <= 0.271 milliseconds (cumulative count 970) 98.438% <= 0.431 milliseconds (cumulative count 985) 99.219% <= 0.615 milliseconds (cumulative count 993) 99.609% <= 0.655 milliseconds (cumulative count 997) 99.805% <= 0.687 milliseconds (cumulative count 999) 99.902% <= 0.719 milliseconds (cumulative count 1000) 100.000% <= 0.719 milliseconds (cumulative count 1000)
每一行是按照,剩余百分比的50%累加的。
-
延迟累积分布 p99之类的信息
Cumulative distribution of latencies: 60.300% <= 0.103 milliseconds (cumulative count 603) 95.000% <= 0.207 milliseconds (cumulative count 950) 97.200% <= 0.303 milliseconds (cumulative count 972) 98.400% <= 0.407 milliseconds (cumulative count 984) 99.000% <= 0.503 milliseconds (cumulative count 990) 99.200% <= 0.607 milliseconds (cumulative count 992) 99.900% <= 0.703 milliseconds (cumulative count 999) 100.000% <= 0.807 milliseconds (cumulative count 1000)
例如 99.9%的请求都在0.703ms内返回
-
summary
throughput summary: 62500.00 requests per second latency summary (msec): avg min p50 p95 p99 max 0.113 0.032 0.095 0.207 0.447 0.719