瑞士军刀Redis
一、慢查询
1.客户端请求的生命周期
- 慢查询发生在第三阶段:执行命令
- 客户端超时不一定是慢查询,但慢查询是客户端超时的一个可能因素。
2.slowlog
redis的slowlog是redis用于记录慢查询执行时间的日志系统。由于slowlog只保存在内存中,因此slowlog的效率很高,完全不用担心会影响到redis的性能。
(1)slowlog-log-slower-than
slowlog-log-slower-than表示slowlog的划定界限,只有query执行时间大于slowlog-log-slower-than的才会定义成慢查询,才会被slowlog进行记录。slowlog-log-slower-than设置的单位是微秒,默认是10000微秒,也就是10ms
(2)slowlog-max-len
slowlog-max-len表示慢查询最大的条数,默认是128。slowlog会被放在一个先进先出的队列中,如果队列中slowlog数量大于最大长度,就删除最早的slowlog。
3.慢查询命令
- slowlog get [n]:获取慢查询队列(n条)
- slowlog len:获取慢查询队列长度
- slowlog reset:清空慢查询队列
4.运维经验
- slowlog-log-slower-than不要设置过大,默认10ms,通常设置1ms;
- slowlog-max-len 不要太小,通常设置1000左右;
- 定期持久化慢查询。
二、管道pipeline
1.n次网络命令通信
假如每次发送一个命令,返回一个结果。
那么要执行n条命令: n次命令时间 = n次网络时间 + n次执行时间
2.什么是管道
将一批命令打包发送给服务器,服务器计算后,按照顺序打包发送回客户端。
1次命令时间(n条命令) = 1次网络时间 + n次执行时间
3.管道的作用
Redis的操作是微秒级别的,在使用中,网速是制约速度的重要因素。一条命令从上海发到北京按光速计算要13ms,而在服务端执行也就几微秒。
所以一旦执行批量命令,不使用管道的话,带来的开销是非常大的。
4.pipeline与原生的m操作对比
m操作是一个整体,其是一个原子的。而pipeline执行时,命令是拆分开的。
三、发布订阅
发布订阅模式中有三种角色:发布者(publisher)、订阅者(subscriber)、频道(channel)。
发布者向频道中发布消息,订阅者获取所关注频道的消息。订阅者可以关注多个频道,发布者也可以发布在多个频道。
API
发布命令:
-
publish channel message
向channel中发布message,返回channel的订阅数。
订阅命令
-
subscribe [channel]
订阅一个或多个频道 -
unsubscribe [channel]
取消订阅一个或多个频道 -
psubscribe [pattern]
订阅指定模式的频道(比如v*
表示以v开头的频道)
四、位图Bitmap
在Redis中,是可以直接操控“位”的。所以,可以使用字符串类型来实现位图。
1.API
-
getbit key offset
获取key的第offset位的值(从左到右) -
setbit key offset value
将key的第offset位设置为value -
bitcount key [start end]
获取位图指定范围内值为1的个数 -
bitop op destkey key [key...]
将多个Bitmap的and(交集)、or(并集)、not(非)、xor(异或)操作结果保存在destkey中。 -
bitpos key targetBit [start] [end]
计算位图指定范围内第一个值为targetBit的位置。
2.场合
用于数据量比较大时判断某个值是否存在的场景。
五、HyperLogLog
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
所谓的基数统计,其实就是统计一组数中不重复元素的个数
1.API
-
pfadd key element [element...]
向hyperloglog中添加元素 -
pfcount key [key...]
计算hyperloglog的基数 -
pfmerge destkey sourcekey [sourcekey...]
合并多个hyperloglog
2.局限性
- 由于算法是基于概率的,所以可能会出现错误。官方给出的错误率为0.81%
- 不会存储数据本身
六、GEO
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作。
-
geoadd key longitude latitude member
:添加地理位置的坐标。longitude是经度,latitude是纬度,member是一个标识 -
geopos key member [member...]
:获取地理位置的坐标。 -
geodist key member1 member2 [unit]
:计算两个位置之间的距离。 -
georadius
:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。 -
georadiusbymember
:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。 -
geohash
:返回一个或多个位置对象的 geohash 值。