慢查询

(客户端请求的)生命周期

redis队列取值不对 redis设置队列长度_慢查询

上图为客户端请求到redis的完整生命周期

查询的两个配置

  1. slowlog-max-len
  • 慢查询是一个先进先出的队列
  • 队列是固定长度的
  • 保存在内存中,如果redis重启,则数据不会持久化,而是随着重启而消失
    第一个参数为设置超时时间,例如当超过10ms就进入慢查询范围内,加入队列中;
    第三个参数为队列长度设置,慢查询的队列长度为100
    第二个参数为队列内容
  1. slowlog-log-slower-than
  • 慢查询阈值(单位:微妙)
  • slowlog-log-slower-than=0,记录所有命令
  • slowlog-log-slower-than<0,不记录任何命令
配置方法
  1. 默认值
  • config get slowlog-max-len =128
  • config get slowlog-log-slower-than = 10000
  1. 修改配置文件重启(如果redis未启动,可这样配置,如果redis已经启动,使用动态配置)
  2. 动态配置
  • config set slowlog-max-len 1000
  • config set slowlog-log-slower-than 1000

三个命令

slowlog get [n]  # 获取慢查询队列(n指定查询几条)
slowlog len # 获取慢查询队列长度
slowlog reset # 清空慢查询队列长度

运维经验

  1. slowlog-log-slower-than不要设置过大,默认10ms,通常设置1ms
  2. config get slowlog-max-len 不要设置过小,通常设置1000左右
  3. 理解命令的生命周期
  4. 定期持久化慢查询

pipline(流水线)

什么是流水线

redis队列取值不对 redis设置队列长度_慢查询_02


redis队列取值不对 redis设置队列长度_ci_03

使用建议

  1. 注意每次pipline携带数据量
  2. pipline每次只能作用在一个Redis节点上

发布订阅

角色

  1. 发布者(publisher)
  2. 订阅者(subscriber)
  3. 频道(channel)

模型

API

  1. publish

redis队列取值不对 redis设置队列长度_redis_04


2. subcrib

redis队列取值不对 redis设置队列长度_redis队列取值不对_05


3. unsubcrib

redis队列取值不对 redis设置队列长度_慢查询_06


4. 其他

redis队列取值不对 redis设置队列长度_慢查询_07

发布订阅与消息队列

发布订阅,是所有订阅者都会收到
消息队列是需要抢的,只有一个客户端能收到

Bitmap

位图

  1. setbit
127.0.0.1:6382> setbit unique:users:2016-04-05 0 1
(integer) 0
  1. getbit
127.0.0.1:6382> getbit unique:users:2016-04-05 11
(integer) 1
  1. bitcount
127.0.0.1:6382> bitcount unique:users:2016-04-05 
(integer) 5
  1. 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
  1. bitpos

独立用户统计

  1. 使用set和Bitmap
  2. 一亿用户,5千万独立
  3. redis队列取值不对 redis设置队列长度_redis_08


  4. redis队列取值不对 redis设置队列长度_redis_09


  5. redis队列取值不对 redis设置队列长度_Redis慢查询_10


HyperLogLog

是否是新的数据结构?

用极小空间完成独立数量统计的一种数据结构。
本质是字符串

127.0.0.1:6382> type 2018_11_24:unique:ids
string

三个命令

redis队列取值不对 redis设置队列长度_redis队列取值不对_11

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

内存消耗

redis队列取值不对 redis设置队列长度_redis队列取值不对_12

使用经验

  1. 错误率0.81%
  2. 无法取出数据,只能统计独立用户数
GEO

GEO是什么

GEO(地理位置定位):存储经纬度,计算两地距离,范围计算等。

5个城市经纬度

redis队列取值不对 redis设置队列长度_redis队列取值不对_13

相关命令

  1. 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
  1. geopos # 获取地理位置信息
127.0.0.1:6382> geopos cities:locations tianjin
1) 1) "117.12000042200088501"
   2) "39.0800000535766543"
  1. geodist # 获取两地之间的距离
  2. redis队列取值不对 redis设置队列长度_redis队列取值不对_14


127.0.0.1:6382> geodist cities:locations tianjin beijing km
"89.2061"
  1. georadius # 获取指定位置范围内的地理位置信息集合
  2. redis队列取值不对 redis设置队列长度_慢查询_15


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