慢查询
1.生存周期
1.发送命令
2.排队
3.执行命令
该阶段发生慢查询,客户端超时不一定是慢查询,慢查询是客户端超时一个因素。
4.返回结果
2.两个配置
1.慢查询是一个先进先出队列 且固定长度,保存在内存内
2.慢查询阀值 slowlog-log-slower-than =0,记录任何命令(所有命令进入慢查询队列)
3.两个配置默认值
config get slowlog-max-len =128 //通常1000左右,也可以定期持久化慢查询
config get slowlog-log-slower-than =10ms //通常1ms
4.修改配置文件重启
5.动态配置
3.慢查询命令
slowlog get[n] :获取固定数量的慢查询队列
slowlog len:查询慢查询队列长度
pipeline
1次时间=1次网络时间(传输命令+放回结果)+1次命令时间
1.什么是流水线
将一批命令进行一次批量打包,1次pipeline(n条命令)=1次网络时间+n次命令时间
2.客户端实现
maven 依赖
Jedis jedis = new Jedis(”127.0.01“,6379);
for( int i=0;i<100;i++){
Pipeline pipeline = jedis.pipelined();
for(int j=i*100;j<(i+1)*100;j++){
pipeline.hset("hashkey:"+j,"field"+j,"value"+j);
}
pipeline.syncAndReturnAll();
3.与原生操作对比
pipeline命令并不是一个原子操作,在内部也是一个个命令执行
使用建议
1.pipeLine 携带数据量
2.每次只能作用于一个结点
发布订阅
1.角色
发布者
频道
订阅者
2.模型
发布者publisher[redis-cli ]—>发布消息 Redis Server 频道
订阅者subcribe[redic -cli ]—->订阅 Redis Server 频道
无法做消息的堆积,不能获取历史的消息
3.API
1.public (发布命令) publish channel message (返回订阅者数量)
2.subcribe(订阅频道) subscribe channel
3.unsubscribe(取消订阅)
4.消息队列
订阅者使用抢的功能,智能一个订阅者收到消息(类似抢红包)
bitmap
1.位图是什么
每个字符都有对应的二进制(ASCII),redis可以直接操作位
set hello big
getbit hello 0 //获取第一个字母ASCII第一个元素
2.相关指令
setbit key offset value # 给位图指定索引设置值 (返回之前的值),尽量避免在一个很短的位图上做一个偏移量很大的操作(中间会补0)
getbit key offset #获取位图上指定索引的值
getCount key [start end] #获取指定范围内值为1 的个数
bitop op destkey key #做多个bitmap 的and(交集) or (并集)
bitpos key targetBIt[start end] #计算位图指定范围(字节单位),第一个偏移量对应的值等于targetBit 的位置
3.独立用户统计
1亿用户,每天5千万独立访问
数据类型 | 每个用户 userid 占用空间 | 需要存储用户量 | 全部内存 |
set | 32 位 | 50 000 000 | 32*50 000 000=200MB |
bitmap | 1 位 | 100 1000 1000 | 1*100 000 000=12.5MB |
HyperLogLog
1.新的数据结构?
极小的空间完成独立用户统计的数量统计
本质还是一个字符串
2.三个指令
pfadd key element[element…] #向hyperloglog 添加元素【1代表添加正常】相同元素不增加数量
pfcount key [key…] #计算hyperloglog 的独立总数
pfmerge destkey sourkey[socurcekey…] #合并多个
3.内存消耗
错误率 0.81%
是否需要单个数据
GEO(3.2 以后) (zset低层)
1.CEO 是什么
地理信息定位 ,计算两地距离,范围计算
2.五个城市经纬度
geoadd key longitude laitude member #添加地理位子信息,member 标识
geopos key member #获取经纬度
geodist key member1 member2 [unit] #获取距离 unit单位
geodist key longitude latitude rediusm m|km|ft #根据一定条件得到范围内数据