当前位置:   article > 正文

3、redis内置的小功能_pipeline.del

pipeline.del

本篇介绍redis内置的一些小的功能,但麻雀虽小,五脏俱全,灵活的应用这些小功能,可以带来许多意想不到的好处。

一、Pipeline(管道)

pipeline是redis提供的批量执行多个命令的工具。对于客户端来说是使用管道一次性发送多个命令给redis服务器,对redis服务器来说是多个命令按照流水线式的去执行,最后统一返回。

1、为什么要使用pipeline?

因为redis的绝大部分命令都不是批量操作的命令,若想短时间内执行多个命令来完成功能,这样每执行一个命令,就会有一次RTT的存在(RTT,即Round Trip Time,往返时间),N个命令就会有N个RTT,此时若redis客户端与redis服务器不部署在同一台机器上,相隔很远,加上点网络延迟,区别一下子就看出来了。

10000条set命令的pipeline和非pipeline效率对比

 

 

 

实际上redis的命令执行时间一般是在微妙级别的,所以才会有redis的性能瓶颈是网络这样的说法。

若是我们使用了pipeline发送10个命令,就会有一次的RTT和10条命令的执行时间,否则就会是10个RTT和10个命令的执行时间。

2、在jedis中使用pipeline

这里仅仅是用pipeline模拟一个批量删除的命令,虽然redis的del本身就支持批量删除

  1. /**
  2. * 批量删除
  3. * @param keyList 要删除的key的集合
  4. */
  5. public static void mdel(List<String> keyList){
  6. Jedis jedis = getJedis(baseId);
  7. //获取pipeline
  8. Pipeline pipeline = jedis.pipelined();
  9. for (String key : keyList) {
  10. pipeline.del(key);
  11. }
  12. //执行结果同步,这样才能保证结果的正确性。实际上不执行该方法也执行了上面的命令,但是结果确不一定完全正确。
  13. //注意
  14. pipeline.sync();
  15. //关闭连接
  16. jedis.close();
  17. }

3、pipeline与原生批量命令的区别

1)pipeline是非原子性的(中间可能穿插其他的命令)原生批量命令时原子性的。

2)pipeline是执行多个命令,原生批量是一个命令对应多个key。

4、pipeline里面的命令也不要太多,不然可能会造成redis阻塞。

二、bitmaps(位图)

bitmaps本质还是字符串,只不过是以位为单位,由n多个0、1组成的字符串,直接操作的也是字符串中的位。可以把bitmaps想象成一个只存储0或1的字符串数组,数组的下标即为bitmaps中的偏移量(偏移量从0开始)。bitmaps专门用来统计数据的0或1的这种状态值。

例如:setbit key 1000 1 #将偏移量为1000的位置上的值设置为1。

例如:1)统计每天有哪些商品被浏览过

分析:以日期为key,若某商品被浏览了,就将该商品id对应的位的值变成1即可。 setbit 2020-06-14 10 1

2)统计每天有多少个商品被浏览了

分析:用bitcount命令统计1的个数即可

3)统计这一年当中哪些商品没有被浏览过

分析:首先得到这些key对应的数据,然后进行按位或操作得到一个bitmaps结果,然后最后找出哪些位置上的值为0即可

三、HyperLogLog

hyperLogLog也是字符串类型,是一种基数统计算法,专门来统计不重复数据的数据量,如日活跃用户量/月活跃用户量等。hyperLogLog只做基数统计,不保存存储的数据,且无论多大的数据量,计算基数所需的空间总是固定的且很小的(十几K)。

相比于set集合:虽然都是数据不重复,但hyperLogLog用来计算数据的总量时所占用的存储空间极小。

相比于incr命令:虽然都是计算数据总量,但hyperLogLog能计算不重复的数据总量,incr不能判断是否重复。

1、添加:

pfadd key element [element … ] #添加一个或多个数据

2、计算数据总量:

pfcount key [key … ] #计算一个或多个key中的数据总量

3、合并数据集

pfmerge destkey key1 [key2 ...] # 将多个key中的数据集合并到destkey中,数据依然不重复

四、geo

redis3.2提供了geo地理位置信息计算相关的命令,非常方便。

五、慢查询日志

redis也像mysql一样,提供了慢查询日志的功能,所谓慢查询日志,就是redis会自动计算每条命令的执行之间,当超过了预设的阈值时,就会将该命令记录下来保存到某处,以此来帮助开发或运维人员来定位系统响应慢的问题。熟悉mysql慢查询日志的都知道,mysql在配置文件(my.cnf/my.ini)中提供了slow-query-log(开关)、log-output(存储形式)、slow_query_log_file(存储位置)、long_query_time(阈值,s)四个参数来设置慢查询日志,同样的,redis在配置文件redis.conf中也提供了两个参数slowlog-log-slower-than、slowlog-max-len来设置慢查询日志。

两个参数:

1)slowlog-log-slower-than=10000

#设置时间阈值,单位微秒(1秒=1000毫秒=1000000微秒),默认值就是10000微秒。值得注意的是,当阈值等于0时,会记录所有的命令,当阈值小于0时,表示关闭慢查询日志。

2)slowlog-max-len=2000

#设置长度阈值,默认1000。实际上redis使用了一个先进先出的队列来存储这些慢命令,当队列长度超过设定的阈值时,最开始入队的慢命令就会被弹出,所以要根据实际情况设置该阈值,避免慢命令还没被看来就被弹出队列了。

三个命令:

redis并没有对外暴露这个慢日志队列,而是提供了三个命令来访问和操作该队列。

1)slowlog len #查询慢日志队列当前的长度。

2)slowlog get [n] #倒叙获取最新的N条慢日志,不带N就是查全部。

3)slowlog reset #清空慢日志队列。

四个参数:

这是一个setex命令被慢查询日志记录后的结果:

  1. 1) (integer) 665
  2. 2) (integer) 1456718400
  3. 3) (integer) 12006
  4. 4) 1) "SETEX"
  5. 2) "video_info_200"
  6. 3) "300"
  7. 4) "2"

可以看到每个慢查询日志由四部分组成:

1)唯一标识id

2)发生的时间戳。

3)命令耗时(微秒)。

4)命令名称及其参数。

运维建议:

可以定期执行slowlog get 命令,将慢查询日志持久化到数据库中,然后制作界面对慢查询日志进行分析,以减少慢查询导致redis阻塞的问题。

六、redis shell

除了上面的命令外,redis还提供了三个脚本工具命令,使用这些命令,有时能很巧妙的解决一些问题。使用redis-xxx --help(windows)或redis-xxx -help(Linux) 查询具体的参数使用方式。

1、redis-cli (客户端脚本)

  1. -r(repeat)num command 将一个命令执行多次。
  2. -r num(interval)second command -i 每隔second秒执行一次命令,共执行num次
  3. -c 连接redis cluster节点时使用。
  4. -a password 相当于auth指令。
  5. --slave 使当前客户端成为当前redis服务的从节点,可以实时看到redis服务器发生的变化,如执行了那些命令等。类似monitor指令。
  6. --rdb filename 让远程redis服务器生成rdb文件,并传输到本地保存。可用作rdb文件的定期备份。
  7. --bigkeys 找到内存占用较大的键值对,方便优化。
  8. --eval luafile 执行一个Lua脚本文件。
  9. --latency 检测客户端和redis服务端的网络延迟,只打印一条。
  10. --latency-history 检测客户端和redis服务端的网络延迟,每隔15秒打印一次,可以结合-i second 选项调整打印间隔。
  11. --stat 每隔一秒获取redis服务器的增量信息,如keys(key的总数量)、mem(总内存大小)、clients(客户端连接数量)、blocked(阻塞的key数量)、requests(总的请求数量)
  12. -v/--version 都是获取当前redis的版本

2、redis-server (服务端脚本)

  1. redis-server /path/to/redis.conf 已指定的配置文件启动redis服务
  2. redis-server --test-memory 2048 检测当前操作系统能否分配2048MB的内存给redis。

3、redis-benchmark (性能测试脚本)

redis-benchmark 可以对redis做基准性能测试,同时也可以检测机器的性能怎么样。这里的测试为:命令从发送、命令入队、执行、返回结果,这样算是一个请求。redis-benchmark 会对部分命令进行基准性能测试,默认每个命令执行10万次。

  1. -c(clients) 代表并发的客户端量,默认50个。
  2. -n(requests) 代表总共的请求次数,默认为10万次。
  3. -q 代表仅显示requests per second部分的信息。
  4. -r (random) 代表随机插入一定数量的key-value对。
  5. -P(pipeline) 总的请求数量当中,使用pipeline的数量。
  6. -t 可以对指定的命令做基准性能测试。
  7. --csv 将执行结果按照CSV格式(Comma-Separated Values,逗号分隔值文件格式,常用在应用程序之间传递数据)输入,便于后续处理。

例如:redis-benchmark -c 100 -n 20000 -r 10000 代表随机插入9999个key-value对。

七、redis的发布和订阅

redis提供了简单的发布订阅模型,虽然不能进行消息的持久化和回溯,但应对一般的发布订阅也是可以的。

1、发布

publish channelName message 向某个频道发布消息

2、订阅

subscribe channel [channel2...] 订阅一个或多个频道,当订阅的频道有消息的时候会立即接收到消息。

unsubscribe channel [channel2...] 取消定于一个或多个频道。

根据pattern订阅和取消订阅

psubscribe sport* news* 订阅以sport开头和以news开头的频道。

punsubscribe sport* 取消定阅sport*开头的频道。

3、查看发布订阅系统的状态

查询活跃的频道(活跃频道即指至少有一个订阅用户的频道)

pubsub channels [pattern] 查看所有的活跃频道或根据模式查询所有的活跃频道。

查询频道的订阅数量

pubsub numsub channel1 [channel2 ...] 查看一个或多个频道的订阅数量

查询根据模式订阅的频道的订阅数

pubsub numpat

 

上一篇:2、redis的1V5及其常用命令

下一篇:4、redis的配置文件和数据管理策略

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/639179
推荐阅读
相关标签
  

闽ICP备14008679号