004 redis高级功能

文章目录

    • 慢查询
    • pipeline
    • 发布订阅
    • bigmap
    • hyperloglog
    • GEO

慢查询

对于较慢的操作(超过1ms的任务),维护一个先进先出队列进行保存

修改配置文件

slowlog-max-len 慢查询有个队列,这个队列的长度,默认是128,建议设置1000

slowlog-log-slower-than 超过多长时间(微秒),进入慢查询?默认是10000微秒,建议1000微秒

config set slowlog-max-len 1000

config set slowlog-log-slower-than 1000

API

slowlog len
slowlog reset
slowlog get 100

pipeline

一次性传递很多命令,只消耗一次网络网络时间。redis执行是微秒级。网络是毫秒级

注意每次pipeline的数据量

注意M操作和pipeline的区别:M操作是原子操作。pipeline不是,它仅仅打包一堆命令。

发布订阅

publish sohu:tv "something"
subscribe sohu:tv
unsubscribe sohu:tv

bigmap

直接操作二进制

getbit key index
setbit key index value  只设置1就好,其他的自动补0
bitcount key [start end] 获取值为1的个数,可以指定范围,范围单位是字节
bitop op destkey [key……]  op[and/or/xor/not]。操作完后存到destkey
bitpos 找出0或者1 第一次出现的位置

hyperloglog

极小的空间完成用户统计,极小极小!但是有0.81%的错误率

pfadd key element[……]   添加元素,如果存在就跳过
pfcount key [……]          统计数量
pfmerge destkey sourcekey[……]     合并多个

GEO

根据经纬度数据,处理地理信息

geoadd key longitude latitude member
geopos key member
geodist key member1 member2 {unit:km/m/mi/ft}
georadiusbymember key member num {unit:km/m/mi/ft}
本质是个zset,所以删除时候用zrem key member 就好

例子:

citygeokey = 'cities'

citysll = [
    '116.28--39.56--beijing',
    '117.12--39.08--tianjin',
    '115.29--38.51--baoding',
    '114.29--38.02--shijiazhuang'
]

for city in citysll:
    lon, lat, cityname = city.split('--')
    r.geoadd(citygeokey, lon, lat, cityname)

# 获得经纬度
print(r.geopos(citygeokey, 'beijing'))
# 根据经纬度计算距离 m km mi(英里) ft(尺)
print(r.geodist(citygeokey, 'beijing', 'tianjin', 'km'))
# 计算下距离北京150km内的城市
print(r.georadiusbymember(citygeokey, 'beijing', '150', 'km'))

你可能感兴趣的:(redis)