附加功能和Redis客户端
慢查询
所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来。
典型的数据库有MySQL
但是redis一条命令执行的过程可以细分为四步
1 发送命令 2 命令排队 3 命令执行 4 返回结果
而慢查询只记录了第三步命令执行的结果,所以没有慢查询不代表客户端没有请求超时,或者网络传输问题导致超时。
慢查询要明确两件事:
慢查询的预设阈值设置,慢查询输出结果地方?
Redis提供了slowlog-log-slower-than
和slowlog-max-len
配置来解决这两个问题。
从字面意思就可以看出,slowlog-log-slower-than就是那个预设阀值,它的单位是微秒(1秒=1000毫秒=1000000微秒),默认值是10000。
slowlog-log-slower-than=0会记录所有的命令,slowlog-log-slower-than<0对于任何命令都不会进行记录
从字面意思看,slowlog-max-len只是说明了慢查询日志最多存储多少条,并没有说明存放在哪里?实际上Redis使用了一个列表来存储慢查询日志,slowlog-max-len就是列表的最大长度。一个新的命令满足慢查询条件时被插入到这个列表中,当慢查询日志列表已处于其最大长度时,最早插入的一个命令将从列表中移出,例如slowlog-max-len设置为5,当有第6条慢查询插入的话,那么队头的第一条数据就出列,第6条慢查询就会入列。
如何修改配置呢?
第一种方式就是直接修改配置文件。
第二种方式是使用config set命令,config set slowlog-log-slower-then 20000这种形式设置,最后还有添加config rewrite
命令持久化到配置文件。
慢查询日记存在内存列表里面,redis提高了命令访问和管理。
slowlog get [n] 返回的查询有四个参数,分别是命令id,发生时间戳,命令耗时,命令形式
slowlog len 返回多少列表条数
slowlog reset
最佳实践:
·slowlog-max-len选定1000以上为合适值
·slowlog-log-slower-than配置建议:默认值超过10毫秒判定为慢查询,需要根据Redis并发量调整该值,对于高OPS流量场景的Redis建议设置为1毫秒
redis shell
redis提供了三个工具
redis-cli redis-server redis-benchmark
redis-cli -r 3 ping
redis-cli连接客户端
redis-cli 命令 | |
---|---|
redis-cli-help -h -p | 帮助,ip,端口 |
-r repeat | 命令的重复次数 |
-i interval(second) | 命令执行的间隔 |
-x stdin | 从标准输入给redis |
-c cluster | 可以防止moved和ask异常 |
-a auth | |
--scan --pattern scan key | 浏览键 |
--slave 自己模拟是自己的副本,可以看到自己的更新操作 | 当前客户端模拟当前redis节点的从节点 |
--rdb | 持久化,在本地生产rdb文件 |
--pipe | |
--eval | 执行lua脚本 |
--latency,--latency-history,--lantency-dist | 检测网络延迟,对运维十分帮助 |
--stat | |
--raw --no-raw | 返回命令的结果,二进制形式 |
如果需要验证密码,那么
redis-cli -a 201709 其中-a这个命令需要在最前面
#### redis-server启动服务端
test-memory可以用来检测当前操作系统能否稳定地分配指定容量的内存给Redis,通过这种检测可以有效避免因为内存问题造成Redis崩溃,例如下面操作检测当前操作系统能否提供1G的内存给Redis.
redis-server --test-momery 1024
该功能更偏向于调试和测试,只是做了简单的测试
maxmemory选项可以设置redis占用的最大内存数量
redis-benchmark 基准测试
提供了很多选项帮助开发和运维人员测试Redis的相关性能
-c | 客户端并发数量,默认50 |
---|---|
-n< requests> | 客户端请求总数 |
-q -r -P | |
--csv | 输出到excel |
-k< boolean> | 客户端是否使用keekalive |
-t | 对指定命令测试 |
Pipeline
利用管道技术,将redis命令组合成为一条命令,通过一次网络传输,把命令全部发送到服务端,--pipe命令,就是将redis命令组装,一次发送,节省了RTT时间。
注意:原生批量命令是原子的,而Pipeline不是原子的
原生批量命令是一个命令对应多个key,Pipeline支持多个命令
原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同实现。
pipeline的用处是,原生的批量命令不是每个命令都有批量操作,而pipeline可以将不同的命令直接组装起来,但是值得注意,如果组装的命令过多,那么也可能造成网络阻塞。
Lua
Lua脚本在Redis中是原子执行的,执行过程中间不会插入其他命令。
Lua脚本可以帮助开发和运维人员创造出自己定制的命令,并可以将这些命令常驻在Redis内存中,实现复用的效果。
Lua脚本可以将多条命令一次性打包,有效地减少网络开销。
缺省
BitMaps
Bitmaps本身不是一种数据结构,实际上它就是字符串,但是它可以对字符串的位进行操作。
可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。
setbit key offset value
gitbit key offset
bitcount [start][end]
bitop op destkey key[key...]
bitpos key targetbit [start][end]
计算key中第一个出现target的偏移量
HyperLogLog
HyperLogLog并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,数据集可以是IP、Email、ID等。HyperLogLog提供了3个命令:
pfadd、pfcount、pfmerge。
pfadd key element[element]
pfcount key [key]
pfmerge destkey sourcekey[sourcekey] 并集并赋值给destkey
127.0.0.1:6379> pfadd pf "uid1" "uid2" "uid4" "uid7" "uid7" "uid2"
(integer) 1
127.0.0.1:6379> pfcount pf //不重复的个数是4
(integer) 4
127.0.0.1:6379> pfadd af "uid1" "uid6" "uid10" "uid5"
(integer) 1
127.0.0.1:6379> pfmerge bc af pf //af与pf的并集赋予bc
OK
127.0.0.1:6379> pfcount bc
(integer) 7
HyperLogLog必然不是100%的正确,其中一定存在误差率。Redis官方给出的数字是0.81%的失误率。
GEO
Redis3.2版本提供了GEO(地理信息定位)功能,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。
geoadd key longitude latitude member [longitude latitude member ...]
longitude、latitude、member分别是该地理位置的经度、纬度、成员
geopos key member [member ...]
获取城市的地理位置
geodist key member1 member2 [unit]
计算城市之间的距离
GEO的底层实现是zset
客户端
客户端通信协议:
第
一,客户端与服务端之间的通信协议是在TCP协议之上构建的。
第二,Redis制定了RESP(REdis Serialization Protocol,Redis序列化协议)实现客户端与服务端的正常交互,这种协议简单高效,既能够被机器解析,又容易被人类识别。
比如命令 set name lin
被RESP解析成为*3
$3
set
$4
name
$3
lin
格式是 参数个数 第一个参数的字符串个数 第一个参数的字符串 ....
Redis的返回结果类型分为以下五种:
·状态回复:在RESP中第一个字节为"+"。
·错误回复:在RESP中第一个字节为"-"。
·整数回复:在RESP中第一个字节为":"。
·字符串回复:在RESP中第一个字节为"$"。
·多条字符串回复:在RESP中第一个字节为"*"。
java高级语言的redis客户端是Jedis
使用要点:用连接池连接;会用Pipeline;lua脚本支持。
客户端管理
clien list
client list命令能列出与Redis服务端相连的所有客户端连接信息。
监控输入缓冲区异常的方法有两种:
- 通过定期执行client list命令,收集qbuf和qbuf-free找到异常的连接记录并分析,最终找到可能出问题的客户端
- 通过info命令的info clients模块,找到最大的输入缓冲区
输出缓冲区:obl、oll、omem
其他的命令
client setName
client getName
client kill
client pause
monitor #用于监控Redis正在执行的命令,高并发下不用
客户端相关配置
timeout:检测客户端空闲连接的超时时间,一旦idle时间达到了timeout,客户端将会被关闭,如果设置为0就不进行检测。
maxclients:客户端最大连接数
tcp-keepalive:检测TCP连接活性的周期,默认值为0,也就是不进行检测,如果需要设置,建议为60
tcp-backlog:TCP三次握手后,会将接受的连接放入队列中,tcp-backlog就是队列的大小,它在Redis中的默认值是511。通常来讲这个参数不需要调整。
客户端统计片段,可以排查redis异常发生的原因
info clients
info stats