慢查询
生命周期
发送命令,
排队,
执行命令,
返回结果
慢查询发生在第三阶段
客户端超时不一定慢查询,但查询慢是客户端超时的一种可能
- 两个配置
队列长度 slowlog-max-len
1.先进先出
2.固定长度
3.保存在内存中
慢查询阈值 slowlog-log-slower-than
1.(单位:微妙)
2.slowlog-log-slower-than= 0:记录所有命令
3.slowlog-log-slower-than<0:不记录所有命令
默认值
config get slow-max-len=128
config get slow-log-slower-than=10000
修改
config set slow-max-len=256
config set slow-log-slower-than=10001
三个命令
1.slowlog get[n]:获取慢查询队列
2.slowlog len :获取慢查询队列长度
3.slowlog reset :清空慢查询
pipeline 流水线功能
- 什么流水
redis 1次请求时间=1次网络时间+1次计算时间
流水线就是将一批命令打包发送给服务端,服务端一次执行,这样
redis 1次请求时间=1次网络时间+n次计算时间
这样可以大大减少网络的开销,这就是流水线 redis的计算时间是微妙级别,因此redis大部分时间是花在网络时间上
- 客户端实现
没有pipleline的情况下
Jedis jedis=new Jedis("localhost",6379);
for(int i=0;i<10000;i++){
jedis.hset("hashkey:"+i,"field"+i,"value"+i);
}
#需要50s
使用pipeline
Jedis jedis=new Jedis("localhost",6379)
for(int i=0;i<100;i++){
Pipeline pipeline=jedis.piplined();
for(int j=i*100;j<(i+1)*100;j++){
pipeline.hset("hashkey:"+j,"field"+j,"value"+j)
}
pipeline.syncAndReturnAll();
}
#需要0.7s
- 与原生操作对比
m操作是原子性操作,而pipeline是非原子性操作的。但返回的结果是顺序性的
使用建议
- 注意每次pipeline携带数据量
- pipeline每次只能作用在一个redis节点上
- M操作与pipeline的区别
发布订阅
角色
发布者(pulisher)
订阅者(subscriber)
频道(channel)
模型
类似生产者消费者模型,类似kafka
API
publish channel message #发布者
subscribe channel #一个或多个
unsubscribe channel #取消订阅
发布
hyperloglog
- 新型的数据结构
基于HyperLogLog算法:极小空间完成独立数量统计
HyperLogLog的本质是字符串
三大命令
pfadd key element[element…]:像hyperloglog添加元素
pfcount key [key…]:计算hyperloglog的独立总数
pfmerge destkey sourcekey[sourcekey…]:合并多个hyperloglog
内存消耗
百万级别的统计只消耗内存kb级别,但是统计的结果不是很准确官方给出的错误率是0.81%
- 使用经验
geo
- GEO是什么
redis3.2新添加的
GEO(地理信息定位):存储经纬度,计算两地距离,范围计算等
- 5个城市的经纬度
添加地理位置信息
geoadd cities:locations 116.28 39.55 beijing
geoadd cities:locations 117.12 39.08 tianjian 114.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baodian
获取地理位置信息
geopos cities:locations tianjian
计算两个位置间的距离并且可以指定单位
geodist cities:locations tianjian beijing km
georadius API
- 相关说明
从3.2版本以后
type geoKey=zset
没有删除API:zrem key member