redis学习笔记(三) 小工具

1. 慢查询

许多存储系统(例如MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis也提供了类似的功能。

1.1 命令执行过程

客户端执行一条命令分为下面几步:

1)发送命令

2)命令排队

3)命令执行

4)返回结果

屏幕快照 2019-04-17 上午9.24.18.png

注意:慢查询只统计第三步命令执行,如果客户端超时不一定就是慢查询导致的,如网络等问题都有可能。

1.2 配置

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对于任何命令都不会进行记录。

Redis使用了一个列表来存储慢查询日志,slowlog-max-len就是列表的最大长度。一个新的命令满足慢查询条件时被插入到这个列表中,当慢查询日志列表已处于其最大长度时,最早插入的一个命令将从列表中移出。

1.3 相关命令

虽然慢查询日志是存放在Redis内存列表中的,但是Redis并没有暴露这个列表的键,而是通过一组命令来实现对慢查询日志的访问和管理。下面介绍这几个命令:

slowlog get // 获取全部慢查询日志
slowlog get n // 获取n个慢查询日志
slowlog len // 获取慢查询日志长度
slowlog reset // 慢查询日志重置

我的本地环境只有一条慢查询日志,输出如下:

1) 1) (integer) 0
   2) (integer) 1555465266
   3) (integer) 14129
   4) 1) "COMMAND"
   5) "127.0.0.1:57640"
   6) ""

可以看到每个慢查询日志有4个属性组成,分别是慢查询日志的标识id、发生时间戳、命令耗时、执行命令和参数。

2. Pipeline

Redis客户端执行一条命令分为如下四个过程:

1)发送命令

2)命令排队

3)命令执行

4)返回结果

其中1)+4)称为Round Trip Time(RTT,往返时间)。

Redis提供了批量操作命令(例如mget、mset等),有效地节约RTT。但大部分命令是不支持批量操作的,例如要执行n次hgetall命令,并没有mhgetall命令存在,需要消耗n次RTT。

Pipeline(流水线)机制能改善上面这类问题,它能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端。

原生批量命令与pipeline对比:

  • 原生批量命令是原子的,Pipeline是非原子的。
  • 原生批量命令是一个命令对应多个key,Pipeline支持多个命令。
  • 原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同实现。

3. 事务

事务表示一组动作,要么全部执行,要么全部不执行。

Redis提供了简单的事务功能,将一组需要一起执行的命令放到multi和exec两个命令之间。multi命令代表事务开始,exec命令代表事务结束,它们之间的命令是原子顺序执行的。

要注意的是redis事务不支持回滚功能,即如果前面的操作成功,后面的操作失败是不会回滚前面的。

4. Bitmaps

许多开发语言都提供了操作位的功能,合理地使用位能够有效地提高内存使用率和开发效率。Redis提供了Bitmaps这个“数据结构”可以实现对位的操作。把数据结构加上引号主要因为:

  • Bitmaps本身不是一种数据结构,实际上它就是字符串,但是它可以对字符串的位进行操作。
  • Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。

常用命令如下:

setbit key offset value // 设置指定偏移量的值
getbit key offset // 获取指定偏移量的值
bitop op destkey key[key....] // Bitmap间与或非等逻辑运算

5. HyperLogLog

HyperLogLog并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,数据集可以是IP、Email、ID等。HyperLogLog提供了3个命令:pfadd、pfcount、pfmerge,使用如下:

pfadd key element [elements...] // 向HyperLogLog添加元素
pfcount key [key ...] // 计算一个或多个HyperLogLog的元素总个数
pfmerge destkey sourcekey [sourcekey...] // 将多个HyperLogLog合并并赋值给destkey

HyperLogLog内存占用量非常小,但是存在0.81%的错误率,一般使用场景为:获取网站某一段时间用户访问量,不需要获取单条数据,并且可以容忍一定的误差率。

你可能感兴趣的:(redis学习笔记(三) 小工具)