redis学习二

附加功能和Redis客户端



慢查询

所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来。

典型的数据库有MySQL

但是redis一条命令执行的过程可以细分为四步

1 发送命令 2 命令排队 3 命令执行 4 返回结果

而慢查询只记录了第三步命令执行的结果,所以没有慢查询不代表客户端没有请求超时,或者网络传输问题导致超时。

慢查询要明确两件事:

慢查询的预设阈值设置,慢查询输出结果地方?

Redis提供了slowlog-log-slower-thanslowlog-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\r\n$3\r\nset\r\n$4\r\nname\r\n$3\r\nlin

格式是 参数个数 \r\n 第一个参数的字符串个数\r\n 第一个参数的字符串\r\n....

Redis的返回结果类型分为以下五种:
·状态回复:在RESP中第一个字节为"+"。
·错误回复:在RESP中第一个字节为"-"。
·整数回复:在RESP中第一个字节为":"。
·字符串回复:在RESP中第一个字节为"$"。
·多条字符串回复:在RESP中第一个字节为"*"。

java高级语言的redis客户端是Jedis

使用要点:用连接池连接;会用Pipeline;lua脚本支持。



客户端管理


clien list

client list命令能列出与Redis服务端相连的所有客户端连接信息。


监控输入缓冲区异常的方法有两种:
  1. 通过定期执行client list命令,收集qbuf和qbuf-free找到异常的连接记录并分析,最终找到可能出问题的客户端
  2. 通过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

posted @ 2021-02-01 14:36  lfcom  阅读(61)  评论(0编辑  收藏  举报