赞
踩
本篇介绍redis内置的一些小的功能,但麻雀虽小,五脏俱全,灵活的应用这些小功能,可以带来许多意想不到的好处。
pipeline是redis提供的批量执行多个命令的工具。对于客户端来说是使用管道一次性发送多个命令给redis服务器,对redis服务器来说是多个命令按照流水线式的去执行,最后统一返回。
因为redis的绝大部分命令都不是批量操作的命令,若想短时间内执行多个命令来完成功能,这样每执行一个命令,就会有一次RTT的存在(RTT,即Round Trip Time,往返时间),N个命令就会有N个RTT,此时若redis客户端与redis服务器不部署在同一台机器上,相隔很远,加上点网络延迟,区别一下子就看出来了。
实际上redis的命令执行时间一般是在微妙级别的,所以才会有redis的性能瓶颈是网络这样的说法。
若是我们使用了pipeline发送10个命令,就会有一次的RTT和10条命令的执行时间,否则就会是10个RTT和10个命令的执行时间。
这里仅仅是用pipeline模拟一个批量删除的命令,虽然redis的del本身就支持批量删除
- /**
- * 批量删除
- * @param keyList 要删除的key的集合
- */
- public static void mdel(List<String> keyList){
- Jedis jedis = getJedis(baseId);
- //获取pipeline
- Pipeline pipeline = jedis.pipelined();
- for (String key : keyList) {
- pipeline.del(key);
- }
- //执行结果同步,这样才能保证结果的正确性。实际上不执行该方法也执行了上面的命令,但是结果确不一定完全正确。
- //注意
- pipeline.sync();
- //关闭连接
- jedis.close();
- }
1)pipeline是非原子性的(中间可能穿插其他的命令),原生批量命令时原子性的。
2)pipeline是执行多个命令,原生批量是一个命令对应多个key。
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只做基数统计,不保存存储的数据,且无论多大的数据量,计算基数所需的空间总是固定的且很小的(十几K)。
相比于set集合:虽然都是数据不重复,但hyperLogLog用来计算数据的总量时所占用的存储空间极小。
相比于incr命令:虽然都是计算数据总量,但hyperLogLog能计算不重复的数据总量,incr不能判断是否重复。
1、添加:
pfadd key element [element … ] #添加一个或多个数据
2、计算数据总量:
pfcount key [key … ] #计算一个或多个key中的数据总量
3、合并数据集
pfmerge destkey key1 [key2 ...] # 将多个key中的数据集合并到destkey中,数据依然不重复
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) (integer) 665
- 2) (integer) 1456718400
- 3) (integer) 12006
- 4) 1) "SETEX"
- 2) "video_info_200"
- 3) "300"
- 4) "2"
可以看到每个慢查询日志由四部分组成:
1)唯一标识id
2)发生的时间戳。
3)命令耗时(微秒)。
4)命令名称及其参数。
运维建议:
可以定期执行slowlog get 命令,将慢查询日志持久化到数据库中,然后制作界面对慢查询日志进行分析,以减少慢查询导致redis阻塞的问题。
除了上面的命令外,redis还提供了三个脚本工具命令,使用这些命令,有时能很巧妙的解决一些问题。使用redis-xxx --help(windows)或redis-xxx -help(Linux) 查询具体的参数使用方式。
redis-benchmark 可以对redis做基准性能测试,同时也可以检测机器的性能怎么样。这里的测试为:命令从发送、命令入队、执行、返回结果,这样算是一个请求。redis-benchmark 会对部分命令进行基准性能测试,默认每个命令执行10万次。
例如:redis-benchmark -c 100 -n 20000 -r 10000 代表随机插入9999个key-value对。
redis提供了简单的发布订阅模型,虽然不能进行消息的持久化和回溯,但应对一般的发布订阅也是可以的。
publish channelName message 向某个频道发布消息
subscribe channel [channel2...] 订阅一个或多个频道,当订阅的频道有消息的时候会立即接收到消息。
unsubscribe channel [channel2...] 取消定于一个或多个频道。
根据pattern订阅和取消订阅
psubscribe sport* news* 订阅以sport开头和以news开头的频道。
punsubscribe sport* 取消定阅sport*开头的频道。
查询活跃的频道(活跃频道即指至少有一个订阅用户的频道)
pubsub channels [pattern] 查看所有的活跃频道或根据模式查询所有的活跃频道。
查询频道的订阅数量
pubsub numsub channel1 [channel2 ...] 查看一个或多个频道的订阅数量
查询根据模式订阅的频道的订阅数
pubsub numpat
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。