Redis进阶
慢查询
- 生命周期
说明:
(1) 慢查询发生在第三阶段
(2) 客户端超时不一定慢查询,单慢查询是客户端超时的一个可能因素
- 两个配置
slowlog - max -len
先进先出队列
固定长度
保存在内存内
slowlog - log - slower - than
慢查询阀值(单位:微妙)
slowlog-log-slower-than = 0 , 记录所有命令
slowlog-log-slower-than < 0 , 不记录所有命令
其中slowlog-log-slower-than表示slowlog的划定界限,只有query执行时间大于slowlog-log-slower-than的才会定义成慢查询,才会被slowlog进行记录。slowlog-log-slower-than设置的单位是微妙,默认是10000微妙,也就是10ms
slowlog-max-len表示慢查询最大的条数,当slowlog超过设定的最大值后,会将最早的slowlog删除,是个FIFO队列
配置方法
- 默认值:
config get slowlog-max-len = 128
config get slowlog-log-slower-than = 10000
- 支持动态操作:
config set slowlog-max-len = 1000
config set slowlog-log-slower-than = 1000
- 三个命令
- slowlog get [n] : 获取慢查询队列
- slowlog len : 获取慢查询队列的长度
- slowlog reset : 清空慢查询队列
- 运维相关
slowlog-max-len 不要设置过大,默认10ms ,通常1ms
slowlog-log-slower-than 不要设置过小,通常设置 1000左右
理解命令生命周期
定期持久化慢查询
pipeline
- 什么是流水线
1次 pipeline (n条命令) = 1次网络时间 + n次命令时间
发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
类似于 Producer(生产者) -- Consumer(消费者)
- API
publish (发布)
127.0.0.1:6379> publish sohu:tv "hell world"
(integer) 0 #订阅者个数
subcribe(订阅)
127.0.0.1:6379> subscribe sohu:tv
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "sohu:tv"
3) (integer) 1
unsubscribe (取消订阅)
127.0.0.1:6379> unsubscribe sohu:tv
1) "unsubscribe"
2) "sohu:tv"
3) (integer) 0
其他
Bitmap 位图
BitMap是什么
就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。
Redis中的BitMap
Redis从2.2.0版本开始新增了setbit,getbit,bitcount等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为setbit等命令只不过是在set上的扩展。
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379>
127.0.0.1:6379> getbit hello 0
(integer) 0
127.0.0.1:6379> getbit hello 1
(integer) 1
- setbit
给位图指定索引设置值
127.0.0.1:6379> setbit unique 0 1
(integer) 0
127.0.0.1:6379> setbit unique 5 1
(integer) 0
127.0.0.1:6379> setbit unique 11 1
(integer) 0
127.0.0.1:6379> setbit unique 15 1
(integer) 0
127.0.0.1:6379> setbit unique 19 1
(integer) 0
- getbit
获取位图指定索引的值
127.0.0.1:6379> getbit unique 8
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> getbit unique 1
(integer) 0
- bitcount
获取位图指定范围(start 到 end,如果不指定就获取全部) 位值为1到个数
127.0.0.1:6379> bitcount unique
(integer) 5
127.0.0.1:6379> bitcount unique 1 3
(integer) 3
- bitop
做多个Bitmap 的 and (交集)、or(并集)、not(非)、xor(异或)、操作并将结果保存destkey 中
# 求两个位图的并级
127.0.0.1:6379> bitop and unique:and:2016_04_04-2016_04_05 unique
(integer) 3
- bitpos
计算位图指定范围 (start 到 end、单位为字节,如果不指定就是获取全部)第一个偏移量对应到值等于 targetBit的位置
127.0.0.1:6379> bitpos unique 1
(integer) 0
HyperLogLog
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog
的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基
数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog
不能像集合那样,返回输入的各个元素。
- API
PFADD key element [element ...]
添加指定元素到 HyperLogLog 中。
127.0.0.1:6379> pfadd 2017_03_06:unique:ids "uuid-1" "uuid-2" "uuid-3"
(integer) 1
PFCOUNT key [key ...]
返回给定 HyperLogLog 的基数估算值。
127.0.0.1:6379> pfcount 2017_03_06:unique:ids
(integer) 3
PFMERGE destkey sourcekey [sourcekey ...]
将多个 HyperLogLog 合并为一个 HyperLogLog
127.0.0.1:6379> pfadd 2017_03_06:unique:ids "uuid-1" "uuid-2" "uuid-3" "uuid-90"
(integer) 1
127.0.0.1:6379> pfmerge 2017_03_06:unique:ids
OK
GEO
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。
GEOADD
GEOADD key longitude latitude member [longitude latitude member ...]
用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。
127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijing
(integer) 1
127.0.0.1:6379> geoadd cities:locations 116.28 39.55 tianjin
(integer) 1
geopos:
GEOPOS key member [member ...]
用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
127.0.0.1:6379> geopos cities:locations beijing
1) 1) "116.28000229597091675"
2) "39.5500007245470826"
geodist :
GEODIST key member1 member2 [m|km|ft|mi]
用于返回两个给定位置之间的距离。
127.0.0.1:6379> GEODIST cities:locations beijing tianjin
"0.0000"
geohash
GEOHASH key member [member ...]
用于获取一个或多个位置元素的 geohash 值。
127.0.0.1:6379> geohash cities:locations beijing tianjin
1) "wx48ypbe2q0"
2) "wx48ypbe2q0"
georadius、georadiusbymember
georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
georadiusbymember 和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember 的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。
语法:
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD]
[WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST
key]
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST]
[WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
参数说明:
- m :米,默认单位。
- km :千米。
- mi :英里。
- ft :英尺。
- WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
- WITHCOORD: 将位置元素的经度和维度也一并返回。
- WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
- COUNT 限定返回的记录数。
- ASC: 查找结果根据距离从近到远排序。
- DESC: 查找结果根据从远到近排序。
127.0.0.1:6379> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km WITHDIST
1) 1) "Palermo"
2) "190.4424"
2) 1) "Catania"
2) "56.4413"
127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km WITHCOORD
1) 1) "Palermo"
2) 1) "13.36138933897018433"
2) "38.11555639549629859"
2) 1) "Catania"
2) 1) "15.08726745843887329"
2) "37.50266842333162032"
127.0.0.1:6379>
127.0.0.1:6379> GEOADD Sicily 13.583333 37.316667 "Agrigento"
(integer) 1
127.0.0.1:6379> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 0
127.0.0.1:6379> GEORADIUSBYMEMBER Sicily Agrigento 100 km
1) "Agrigento"
2) "Palermo"
127.0.0.1:6379>