·慢查询分析:通过慢查询分析,找到有问题的命令进行优化。
·Redis Shell:功能强大的Redis Shell会有意想不到的实用功能。
·Pipeline:通过Pipeline(管道或者流水线)机制有效提高客户端性能。
·事务与Lua:制作自己的专属原子命令。
·Bitmaps:通过在字符串数据结构上使用位操作,有效节省内存,为开
发提供新的思路。
·HyperLogLog:一种基于概率的新算法,难以想象地节省内存空间。
·发布订阅:基于发布订阅模式的消息通信机制。
·GEO:Redis3.2提供了基于地理位置信息的功能。
3.1 慢查询分析
Redis提供了slowlog-log-slower-than和slowlog-max-len配置来解决这两个问题。从字面意思就可以看出,slowlog-log-slower-than就是那个预设阀值,它的单位是微秒(1秒=1000毫秒=1000000微秒),默认值是10000,假如执行了一条“很慢”的命令(例如keys*),如果它的执行时间超过了10000微秒,那么它将被记录在慢查询日志中。
如果slowlog-log-slower-than=0会记录所有的命令,slowlog-log-slower-than<0对于任何命令都不会进行记录。从字面意思看,slowlog-max-len只是说明了慢查询日志最多存储多少条,并没有说明存放在哪里?实际上Redis使用了一个列表来存储慢查询日志,slowlog-max-len就是列表的最大长度。一个新的命令满足慢查询条件时被插入到这个列表中,当慢查询日志列表已处于其最大长度时,最早插入的一个命令将从列表中移出,例如slowlog-max-len设置为5,当有第6条慢查询插入的话,那么队头的第一条数据就出列,第6条慢查询就会入列。
在Redis中有两种修改配置的方法,一种是修改配置文件,另一种是使用config set命令动态修改。例如下面使用config set命令将slowlog-log-slower-than设置为20000微秒,slowlog-max-len设置为1000:
config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
config rewrite
slowlog get
slowlog len
slowlog reset
3.2 Redis Shell
redis-cli详解:
redis-cli --help查看帮助
-r(repeat)选项代表将命令执行多次
-i(interval)选项代表每隔几秒执行一次命令
-a(auth)选项,有了这个选项就不需要手动输入auth命令
--scan选项和--pattern选项用于扫描指定模式的键,相当于使用scan命令
-slave选项是把当前客户端模拟成当前Redis节点的从节点,可以用来获取当前Redis节点的更新操作
--rdb选项会请求Redis实例生成并发送RDB持久化文件,保存在本地。可使用它做持久化文件的定期备份
--pipe选项用于将命令封装成Redis通信协议定义的数据格式,批量发送给Redis执行
--bigkeys选项使用scan命令对Redis的键进行采样,从中找到内存占用比较大的键值,这些键可能是系统的瓶颈
--eval选项用于执行指定Lua脚本
--latency、--latency-history、--latency-dist。它们都可以检测网络延迟,对于Redis的开发和运维非常有帮助
--stat选项可以实时获取Redis的重要统计信息,虽然info命令中的统计信息更全,但是能实时看到一些增量的数据(例如requests)对于Redis的运维还是有一定帮助的
--no-raw选项是要求命令的返回结果必须是原始的格式,--raw恰恰相反,返回格式化后的结果。如果使用了--raw选项,将会返回中文,原始格式。
redis-server详解:
redis-server --test-memory可以用来检测当前操作系统能否稳定地分配指定容量的内存给Redis。
redis-benchmark详解:
-c(clients)选项代表客户端的并发数量(默认是50)
-n(num)选项代表客户端请求总量(默认是100000)
例如redis-benchmark-c100-n20000代表100各个客户端同时请求Redis,一共执行20000次。redis-benchmark会对各类数据结构的命令进行测试,并给出性能指标。
-q选项仅仅显示redis-benchmark的requests per second信息
使用-r(random)选项,可以向Redis插入更多随机的键
-P选项代表每个请求pipeline的数据量(默认为1)
-k选项代表客户端是否使用keepalive,1为使用,0为不使用,默认值1
-t选项可以对指定命令进行基准测试
--csv选项会将结果按照csv格式输出,便于后续处理,如导出到Excel等
3.3 Pipeline
Pipeline(流水线)机制能改善上面这类问题,它能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端。
原生批量命令与Pipeline对比:
·原生批量命令是原子的,Pipeline是非原子的。
·原生批量命令是一个命令对应多个key,Pipeline支持多个命令。
·原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同实现。
3.4 事务与Lua
Redis提供了简单的事务功能,将一组需要一起执行的命令放到multi和exec两个命令之间。multi命令代表事务开始,exec命令代表事务结束,它们之间的命令是原子顺序执行的。Redis提供了简单的事务,之所以说它简单,主要是因为它不支持事务中的回滚特性,同时无法实现命令之间的逻辑关系计算。
Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序移植到其他应用程序,它是由C语言实现的,Redis将Lua作为脚本语言可帮助开发者定制自己的Redis命令。
在Redis中执行Lua脚本有两种方法:eval和evalsha。
3.5 Bitmaps
·Bitmaps本身不是一种数据结构,实际上它就是字符串(如图3-10所示),但是它可以对字符串的位进行操作。
·Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。
3.6 HyperLogLog
HyperLogLog并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,数据集可以是IP、Email、ID等。HyperLogLog提供了3个命令:pfadd、pfcount、pfmerge。
3.7 发布订阅
publish channel message
subscribe channel [channel ...]
·客户端在执行订阅命令之后进入了订阅状态,只能接收subscribe、psubscribe、unsubscribe、punsubscribe的四个命令。
·新开启的订阅客户端,无法收到该频道之前的消息,因为Redis不会对发布的消息进行持久化。
和很多专业的消息队列系统(例如Kafka、RocketMQ)相比,Redis的发布订阅略显粗糙,例如无法实现消息堆积和回溯。但胜在足够简单,如果当前场景可以容忍的这些缺点,也不失为一个不错的选择。
3.8 GEO
Redis3.2版本提供了GEO(地理信息定位)功能,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能,对于需要实现这些功能的开发者来说是一大福音。