1. 慢查询分析
客户端提交指令给redis并返回执行结果,这个过程包括如下几个步骤:
提交指令->命令排队->执行命令->返回结果
而慢查询只是统计执行命令的时间,因此没有慢查询并不代表客户端没有超时
慢查询配置:
slowlog-log-slower-than:慢查询阈值,即执行时间多长被定义成慢查询
slowlog-max-len:保留多少条慢查询记录,因为Redis使用了一个列表来存储慢查询日志,这个值就是列表长度
上述2个参数可以在配置文件中设置,也可以通过指令设置,如下所示
config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
config rewrite //将上述修改同步保存到配置文件中去
慢查询指令:
slowlog get [n]:获取所有慢查询或队列前N条慢查询,每个慢查询返回值为id、发生时间、执行耗时、执行指令和参数
slowlog len:慢查询队列中元素个数
slowlog reset:清空慢查询队列
最佳实践:
slowlog-max-len:线上建议调大,如1000以上
slowlog-log-slower-than:默认为10毫秒,对于并且较高的场景,建议设置为1毫秒,如果指令耗时都在1毫秒,那么redis的OPS不到1000.
客户端网络超时故障排查:需要检查是否因慢查询引起,检查请求堆积情况,检查网络情况
可定期将慢查询日志持久化到其他数据库系统中,如MySQL
2. Pipeline
管道pipeline它能将一批Redis命令进行组装,通过一次请求提交给Redis,再将这组Redis命令的执行结果按顺序返回给客户端。
Pipeline是非原子的,如多个命令在执行的中间发生了异常,那么将会丢失未执行的命令。所以我们一般使用pipeline时,需要自己保证执行命令的数据安全性。
Pipeline虽然好用,但是每次Pipeline组装的命令个数不能没有节制,否则一次组装Pipeline数据量过大,一方面会增加客户端的等待时间,另一方面会造成一定的网络阻塞,可以将一次包含大量命令的Pipeline拆分成多次较小的Pipeline来完成。
Pipeline只能操作一个Redis实例,但是即使在分布式Redis场景中,也可以作为批量操作的重要优化手段
原生批量命令与Pipeline对比:
原生批量命令是原子的,Pipeline是非原子的
原生批量命令是一个命令对应多个key,Pipeline支持多个命令
原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同实现
3. Bitmaps
Bitmaps本身不是一种数据结构,实际上它就是字符串,且每个字符只能存储0和1,每个字符在字符串中的索引叫偏移量,redis可以对这种字符串的位进行操作。
命令:
setbit key offset value:在key对应的值的offset为止设置值value,value只能是0或1
gitbit key offset:获取key对应offset上的值
bitcount key [start][end]:获取key指定范围值为1的个数
bitop op destkey key[key....]:op为操作符,如or、and、not、xor,并将计数结果保存到destkey中
假设有2个key,key1和key2,key1保存了上个月登录用户,key2保存了这个月登录用户,
求这2个月都登录过的用户:bitop and key3 key1 key2; bitcount key3
求这2个月登录过的用户:bitop or key4 key1 key2; bitcount key4
应用场景:
统计在线用户、统计活跃用户等
4. 发布订阅模式
publish channelname message:向channelname通道发送消息
subscribe channelname [channelname1...]:订阅某个或多个通道的消息
unsubscribe [channel [channel ...]]:取消订阅
psubscribe pattern [pattern...]:按照某个模式订阅,如订阅通道以IT开头的所有通道,psubscribe IT*
punsubscribe [pattern [pattern ...]]:按照某个模式取消订阅,如 punsubscribe IT*
pubsub channels [pattern]:查询有订阅者的通道(有一个订阅者就算),如以IT开头的通道,pubsub IT*
pubsub numsub [channel ...]:查询通道订阅数,如查看my通道有多少订阅者,pubsub numsub my
pubsub numpat:查看模式订阅数,即通过psubscribe指令订阅的数量
使用场景:
聊天室、公告牌、服务之间利用消息解耦都可以使用发布订阅模式
5. GEO 地理位置信息
Redis3.2版本提供了GEO(地理信息定位)功能,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。
geoadd key longitude latitude member [longitude latitude member ...]:添加地址位置信息,经度 纬度 名称,如 geoadd cities:locations 116.28 39.55 beijing
zrem key member:删除位置信息
geopos key member [member ...]:获取地理位置,如 geopos cities:locations tianjin
geodist key member1 member2 [unit]:计算2地距离,unit为距离单位,如北京和天津的距离, geodist cities:locations tianjin beijing km
获取指定位置范围内的地理信息位置集合:
georadius key longitude latitude radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
georadiusbymember key member radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
georadius和georadiusbymember两个命令的作用是一样的,都是以一个地理位置为中心算出指定半径内的其他地理信息位置,不同的是georadius命令的中心位置给出了具体的经纬度,georadiusbymember只需给出成员即可。其中radiusm|km|ft|mi是必需参数,指定了半径(带单位),这两个命令有很多可选参数,如下所示:
·withcoord:返回结果中包含经纬度。
·withdist:返回结果中包含离中心节点位置的距离。
·withhash:返回结果中包含geohash,有关geohash后面介绍。
·COUNT count:指定返回结果的数量。
·asc|desc:返回结果按照离中心节点的距离做升序或者降序。
·store key:将返回结果的地理位置信息保存到指定键。
·storedist key:将返回结果离中心节点的距离保存到指定键。
例子:距离北京150公里以内的城市
georadiusbymember cities:locations beijing 150 km