慢查询
(客户端请求的)生命周期
上图为客户端请求到redis的完整生命周期
查询的两个配置
- slowlog-max-len
- 慢查询是一个先进先出的队列
- 队列是固定长度的
- 保存在内存中,如果redis重启,则数据不会持久化,而是随着重启而消失
第一个参数为设置超时时间,例如当超过10ms就进入慢查询范围内,加入队列中;
第三个参数为队列长度设置,慢查询的队列长度为100
第二个参数为队列内容
- slowlog-log-slower-than
- 慢查询阈值(单位:微妙)
- slowlog-log-slower-than=0,记录所有命令
- slowlog-log-slower-than<0,不记录任何命令
配置方法
- 默认值
- config get slowlog-max-len =128
- config get slowlog-log-slower-than = 10000
- 修改配置文件重启(如果redis未启动,可这样配置,如果redis已经启动,使用动态配置)
- 动态配置
- config set slowlog-max-len 1000
- config set slowlog-log-slower-than 1000
三个命令
slowlog get [n] # 获取慢查询队列(n指定查询几条)
slowlog len # 获取慢查询队列长度
slowlog reset # 清空慢查询队列长度
运维经验
- slowlog-log-slower-than不要设置过大,默认10ms,通常设置1ms
- config get slowlog-max-len 不要设置过小,通常设置1000左右
- 理解命令的生命周期
- 定期持久化慢查询
pipline(流水线)
什么是流水线
使用建议
- 注意每次pipline携带数据量
- pipline每次只能作用在一个Redis节点上
发布订阅
角色
- 发布者(publisher)
- 订阅者(subscriber)
- 频道(channel)
模型
API
- publish
2. subcrib
3. unsubcrib
4. 其他
发布订阅与消息队列
发布订阅,是所有订阅者都会收到
消息队列是需要抢的,只有一个客户端能收到
Bitmap
位图
- setbit
127.0.0.1:6382> setbit unique:users:2016-04-05 0 1
(integer) 0
- getbit
127.0.0.1:6382> getbit unique:users:2016-04-05 11
(integer) 1
- bitcount
127.0.0.1:6382> bitcount unique:users:2016-04-05
(integer) 5
- bitop
127.0.0.1:6382> bitop and unique:allusers unique:users:2016-04-05 unique:users:2016-04-04
(integer) 3
127.0.0.1:6382> bitcount unique:allusers
(integer) 0
- bitpos
独立用户统计
- 使用set和Bitmap
- 一亿用户,5千万独立
是否是新的数据结构?
用极小空间完成独立数量统计的一种数据结构。
本质是字符串
127.0.0.1:6382> type 2018_11_24:unique:ids
string
三个命令
127.0.0.1:6382> pfadd 2019_11_25:unique:ids "uuid-1" "uuid-2" "uuid-3" "uuid-4"
(integer) 1
127.0.0.1:6382> pfcount 2019_11_25:unique:ids
(integer) 4
127.0.0.1:6382> pfadd 2019_11_25:unique:ids "uuid-1" "uuid-2" "uuid-3" "uuid-90"
(integer) 1
127.0.0.1:6382> pfcount 2019_11_25:unique:ids
(integer) 5
127.0.0.1:6382> pfadd 2018_11_25:unique:ids "uuid-1" "uuid-2" "uuid-3" "uuid-4"
(integer) 1
127.0.0.1:6382> pfcount 2018_11_25:unique:ids
(integer) 4
127.0.0.1:6382> pfadd 2018_11_24:unique:ids "uuid-4" "uuid-5" "uuid-6" "uuid-7"
(integer) 1
127.0.0.1:6382> pfcount 2018_11_24:unique:ids
(integer) 4
127.0.0.1:6382> pfmerge 2018_11_25:unique:ids 2018_11_24:unique:ids
OK
127.0.0.1:6382> pfmerge 2018_11_24_25:unique:ids 2018_11_24:unique:ids 2018_11_25:unique:ids
OK
127.0.0.1:6382> pfcount 2018_11_24_25:unique:ids
(integer) 7
内存消耗
使用经验
- 错误率0.81%
- 无法取出数据,只能统计独立用户数
GEO是什么
GEO(地理位置定位):存储经纬度,计算两地距离,范围计算等。
5个城市经纬度
相关命令
- geoadd # 添加经纬度信息
127.0.0.1:6382> geoadd cities:locations 116.28 39.55 beijing
(integer) 1
127.0.0.1:6382> geoadd cities:locations 117.12 39.08 tianjin 114.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
(integer) 4
- geopos # 获取地理位置信息
127.0.0.1:6382> geopos cities:locations tianjin
1) 1) "117.12000042200088501"
2) "39.0800000535766543"
- geodist # 获取两地之间的距离
127.0.0.1:6382> geodist cities:locations tianjin beijing km
"89.2061"
- georadius # 获取指定位置范围内的地理位置信息集合
127.0.0.1:6382> georadiusbymember cities:locations beijing 150 km # 计算距离北京15km的城市
1) "beijing"
2) "tianjin"
3) "tangshan"
4) "baoding"
相关说明
127.0.0.1:6382> type cities:locations #本质是有序集合
zset
127.0.0.1:6382> zrem cities:locations beijing # 删除操作使用有序集合的操作
(integer) 1