redis的小功能 bitmaps 发布订阅,HyperLogLog GEO LUA
慢查询功能:
慢查询只统计统计客户所发送命令的执行时间。
慢查询日志是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值得时候,就将这条命令的信息(发生时间,耗时,命令详细时间)记录下来。
而这个预设阀值redis提供了slowlog-log-slower-than和slowlog-max-len配置来解决这两个问题 slowlog-log-slower-than(单位是微妙 默认是10000)而slowlog-max-len配置来记录慢查询日志最多存储多少条,
实际上redis使用了一个列表来存储慢查询日志。淘汰策略以队列方式,先进入先淘汰。
//获取日志所有记录
slowlog get
//获取日志长度
slowlog len
//重置:
slowlog reset
Bitmaps:一个位的数组,数组中只能存放0或者1,应用场景适用于检测一个用户是否访问过一个网站 bitmaps的offset 可以代表用户id offset所对应的值0,1代表是否访问,0代表位访问,1代表访问
向bitmaps中添加数据 offset代表数组偏移量。
setbit key offset value
获取值:
getbit key offset
setbit unique:users:2020-10-22 0 1 代表在2020-10-22这一天,id为0的用户访问了这个网站
获取bitmaps指定范围值为1的个数:
bitcount key [start end]注意这里的start与end 都是以字节为单位的,而bitmaps的操作单位是一位。
bitmaps间的操作:
bitop operation destkey key1 key2
operation and or not xor(异或)
bitop and destkey users:2020-10-22 users:2020-10-21 相当于求在21号 22号都访问过该网站的用户个数
计算bitmaps中第一个值为targetbit (0,1)的偏移量
bitpos key targetbit [start] [end]
bitpos unique:users:2020-10-21 1 1 2 相当于求在2020-10-21这一天,在1到2字节 首次使得bitmaps值为1的偏移量
HyperLogLog:并不是一种新的数据结构,而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,数据集可以是ip,email ,id等
HyperLogLog提供了三种命令,pfadd pfcount pfmerge
1:添加
pfadd key element element2....
2:计算一个或者多个独立的用户数
pfcount key [key ..]
3:合并
pfmerge destkey sourcekey sourcekey2 统计两个key的并集进行计数
hyperloglog内存占用量非常小,但是存在错误率,开发者在进行数据结构选型时需要注意这两点:
如果只是为了计算独立总数,不需要获取单条数据,可以容忍一定的误差率
发布/订阅
publish channel message
订阅消息:支持多订阅
subscribe channel channel1 channel2
模式订阅:
psubscribe pattern
模式订取消:
punsubscribe pattern
取消订阅:支持多取消
unsubscribe channel channel1
查询订阅(查看活跃的频道):所谓活跃的频道是指当前频道至少有一个订阅者,可以支持模式(正则匹配所需频道规则)
例如:pubsub channels channel:*r* 查看channel:以r开头或者包含r的活跃的频道
pubsub channels [pattern]
pubsub channels
查看频道订阅数:
pubsub numsub channel
查看模式订阅数:即查看有几个客户端通过模式来订阅
pubsub numpat
GEO:
redis 3.2提供了GEO(地理信息定位)支持存储地理位置信息用来实现诸如附近位置
增加地理位置信息:支持多添加
geoadd key longtitude(经度)latitude(纬度)member [longitude latitude member]
更新也可以使用add,只是这时会返回0
获取地理位置信息:
geopos key member
获取两个地理位置的距离:
geodist key member1 member2 [unit]
unit为单位:m km mi(英里)ft(尺)
获取指定位置范围内的地理位置信息:
georadius key longitude radiusm km|ft|mi
georadiusbymember key member radiusm km|ft|mi
两个命令作用都是一样的
georadiusbymember cities:locations beijing 150 rm 返回以北京为中心,半径为150km范围内的成员
获取geohash
geohaah key member redis使用geohash将二维经度转换为1纬字符串
geohash的字符串越长,表示的位置越精确,当geohash长度为9时,精度在两米左右
两个字符串越相似,它们之间的距离越近,geohash编码和经纬度之间是可以相互转换的
GEO没有提供删除成员的命令,但是因为GEO的底层实现是zset,所以可以借用zrem命令实现对地理位置信息的删除
缺少lua语言脚本的学习