慢查询
Redis客户端执行的时间:发送命令,命令排队,命令执行,返回结果。
慢查询只查询命令执行的时间。
慢查询预设阀值怎么设置:超过slowlog-log-slower-than微秒则记录。最多存储slowlog-max-len条慢查询日志。
慢查询记录存放在哪里?内存中,Redis使用一个列表(先进先出)存储慢查询日志。使用slow get命令将慢查询日志持久化到其他存储中。
获取慢查询日志:slowlog get [n]
重置慢查询日志:slowlog reset
获取慢查询日志列表长度:slowlog len
Pipeline
发送命令的时间+返回结果的时间=往返时间RTT
Pipeline能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端。
原生批量命令是原子的,Pipeline是非原子的。
原生批量命令是一个命令,Pipeline支持多个命令。
原生批量命令服务端支持就可以,Pipeline需要客户端和服务端同时支持。
使用Pipeline需要主要命令的个数,可能造成阻塞和网络拥塞。
事务与Lua
multi开启事务
watch监控key
unwatch取消监控
exec执行事务
discard丢弃事务
Lua脚本语言的数据类型:booleans布尔、numbers数值、strings字符串、tables表格(数组/哈希)。
--是Lua语言的注释
在Redis中执行脚本:
eval 脚本内容 key个数 key列表 参数列表
使用redis-cli --eval直接执行文件
使用evalsha执行Lua脚本,需要先使用script load命令将脚本加载到服务器。evalsha 脚本 SHA1值 key个数 key列表 参数列表
Lua可以使用redis.call函数实现对Redis的访问。还可以使用redis.pcall函数实现对Redis的调用。区别在于前者遇到错误会结束,后者遇到错误会忽略。
Lua脚本在Redis中是原子执行的,可以定制命令,并将这些命令常驻在内存中,实现复用。Lua脚本可以将多条命令一次性打包,有效减少网络开销。
script load加载脚本 script exists判断是否已经加载到服务器 script flush 清空服务器的脚本 script kill 杀掉正在执行的Lua脚本。
Bitmaps
Bitmaps本身不是一种数据结构,实际上它就是字符串,但是它可以对字符串的位进行操作。通过偏移量操作。
setbit key offset value
getbit key offset
bitcount key [start end]
bitop op destkey key [key..]
bitop and destkey key [key..]
bitop or destkey key [key..]
bitop not destkey key [key..]
bitop xor destkey key [key..]
bitpos key targetBit [start] [end] 第一个值作为targetBit的偏移量
HyperLogLog
HyperLogLog并不是一种新的数据结构(实际类型位字符串类型),而是一种基数算法(有误差),通过HyperLogLog可以利用极小的内存完成独立总数的统计。数据集可以是IP、Email、ID等。对应的三个命令pfadd添加、pfcount计数、pfmerge合并。
HyperLogLog算法:https://en.wikipedia.org/wiki/Philippe_Flajolet
发布订阅
发布者客户端向指定的频道channel发布消息,订阅该频道的每个客户端都可以收到该消息。
发布消息publish channel message
订阅消息subscribe channel [channel ...]
取消订阅unsubscribe [channel [channel ...] ]
按照模式订阅psubscribe pattern [pattern]
按照模式取消订阅punsubscribe [pattern [pattern...] ]
查看活跃的频道pubsub channels [pattern]
查看频道订阅数pubsub numsub [channel...]
查看模式订阅数pubsub numpat
发布订阅使用场景:聊天室,公告牌,服务之间利用消息解耦。
GEO
Redis3.2版本提供了GEO地理信息定位功能,支持存储地理位置信息来实现如附近位置、摇一摇这类依赖于地理位置信息的功能。
Redis使用geohash将二维经纬度转换为一维字符串。
GEO的数据类型位zset,Redis将所有地理位置信息的geohash存放在zset中。
geohash编码和经纬度是可以相互转换的。