Fork me on GitHub

Redis系列三慢查询、pipeline

慢查询

生命周期

  • 慢查询发生在执行命令阶段

  • 客户端超时不一定慢查询,但查询是客户端超时的一个可能因素

三个命令

  • slowlog get[n]:获取慢查询队列

  • slowlog len:获取慢查询队列长度

  • slowlog reset:清空慢查询队列

两个配置

  • config get slowlog-max-len = 128
  • config get slowlog -log-slower-than = 10000
pipeline(流水线)

命令 N个命令操作 1次pipeline(n个命令)
时间 n次网络+n次命令 1次网络+n次命令
数据量 1条命令 n条命令

Redis的命令时间是微秒级别

pipeline每次条数要控制(网络)

无pipeline实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Pipe
{
private Jedis jedis;
@Test
public void test()
{
jedis = new Jedis("127.0.0.1", 6379);
long startTime = System.currentTimeMillis();
for(int i=0;i<10000;i++)
{
jedis.hset("hashkey","field%d" +i,"value%d" + i);
}
long endTime = System.currentTimeMillis();
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}
}
1
程序运行时间:828ms

pipeline实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void test1()
{
jedis = new Jedis("127.0.0.1", 6379);
Pipeline pipeline = jedis.pipelined();
long startTime = System.currentTimeMillis();
for(int i=0;i<10000;i++)
{
pipeline.hset("hashkey","field%d" +i,"value%d" + i);
}
pipeline.sync();
jedis.close();
long endTime = System.currentTimeMillis();
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}
1
程序运行时间:56ms
发布订阅

publish(发布命令)publish sohu:tv “hello world”

subcirber(订阅) subcirber sohu:tv

消息队列

Bitmap(位图)

setbit key offset value 给位图指定索引设定值

getbit key offset 获取位图指定索引值

bitcount key [start end] 获取位图指定范围,单位为字节

bitop op destkey key [key…] 做多个Bitmap的and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在destkey中

HyperLogLog

基于HyperLogLog算法:极小空间完成独立数量统计

本质还是字符串

命令

pfadd key element [element …]:向hyperloglog添加元素

pfcount key [key …]:计算hyperloglog的独立总数

pfmerge destkey sourcekey [sourcekey …] :合并多个hyperloglog

GEO

地理信息定位:存储经纬度,计算两地距离,范围计算等

geo key longitude latitude member [longitude latitude member …] 增加地理位置信息

geopos key member [menber] 获取地理位置信息