redis高级指令

一、慢查询

1、定义:配置一个时间,如果查询时间超过该设置值,就认为这是一个慢查询

2、生命周期:客户端=>发送指令=>服务端=>排队=>执行指令(慢查询发生的阶段)=>返回结果

3、慢查询日志配置:

①慢查询日志队列是一个先进先出队列,可以设置队列的最大长度:config get slowlog-max-len 1000(默认128)

②判定慢查询的阈值(微秒):config get slowly-log-slower-than 2000(默认10000,等于0代表记录所有指令,小于0代表不判定慢查询)

4、慢查询日志由4个属性组成:日志id,加入队列的时间戳,指令耗时,指令语句

5、查询慢查询日志队列的指定index:slowlog get

6、查询慢查询日志队列的长度:slowlog len

7、清空慢查询日志队列:slowlog reset

二、管道

1、原生的redis指令没有pipeline功能,但是redis是支持pipeline的,在各个语言的语法中都有对应的方法

2、就是在客户端将若干条指令打包在一条pipeline指令中,再整体发送给服务端,服务端批量执行,再批量返回结果

3、1次pipeline指令的耗时=1次网络时间+n次执行指令时间

4、pipeline中的指令会同步成功或同步失败

5、pipeline与mget等操作的区别:通过pipeline提交的多次命令,在服务端执行的时候,可能会被拆成多次执行,而mget等操作,是一次性执行的,所以,pipeline执行的命令并非原子性的

6、一条pipeline只能作用于同一个节点上

7、python端实现:

import redis

# 创建连接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 取出连接对象
conn = redis.Redis(connection_pool=pool)
# 创建pipeline对象,声明事务性
pipe = r.pipeline(transaction=True)
# 开启事务,开启后只能进行pipeline的操作,若执行其他操作可能抛异常
pipe.multi()
# 批量写入指令
pipe.set('name', 'lqz')
pipe.set('role', 'nb')
# 执行pipeline
pipe.execute()

三、事务

1、开启事务:multi

2、编写指令:set name tom => set age 18 => set gender male

3、执行事务:exec

四、事务加watch实现乐观锁

1、进程一:watch age => multi => decr age

2、进程二:mutil => decr age => exec

3、进程一:exec => 因为进程一的事务提交前对数据进行了比对,发现数据已被修改,所以执行失败

五、发布订阅

1、基于消费者生产者模型,发布者与订阅者都是redis客户端,频道是redis服务端

2、发布者将消息推发布到频道中,频道会将消息推送给所有订阅了该频道的订阅者

3、发布消息:publish channel message

4、订阅频道,可多个:subscribe channel

5、取消订阅,可多个:unsubscribe channel

6、订阅模式匹配,订阅c开头的频道:psubscribe c*

7、订阅模式退订,取消c开头频道的订阅:unpsubscribe c*

8、列出所有至少有一个订阅者的频道:pubsub channels

9、列出指定频道的订阅者的数量:pubsub numsub channel

10、列出所有订阅模式的数量:pubsub numpat

11、发布订阅与消息队列的区别:订阅者都可以收到消息,无竞争,消息队列中的消息只有一份需要竞争

六、位图

1、查询指定bitsite的bit,返回0或1:getbit key bitsite

2、修改指定bitsite的bit:setbit key bitsite bit => 若key不存在,则创建key,把index前面的位都第以0填充

3、查询指定index(index等于8bitsite)范围的bit为1的个数:bitcount key start end => 不指定范围则表示全部范围

4、查询key1与key2的交集|并集|非运算|异或运算的结果,并保存于newkey:bitop and|or|not|xor newkey key1 key2

5、查询指定index(index等于8bitsite)范围的bit为targetbit的bitsite:bitpos key targetbit start end => 不指定范围则表示全部范围

6、唯一id统计集合与位图的区别:

①集合:每个id占空间32位,用户量为5000万,需要存储的用户量为5000万,所需内存:32*5000万=200M

②位图:每个id空空间1位,用户量为5000万,需要存储的用户量为1亿(是否登录两种状态):所需内存:1*1亿=12.5M

七、HyperLogLog

1、HyperLogLog中只保留唯一元素,无法读出原值,只能统计个数,100万条数据只占15k,重复率0.81%

2、向hyperloglog中添加元素,可同时添加多个:pfadd key element

3、查询hyperloglog中独立元素的个数:pfcount key

4、将key1与key2的合并结果存于newkey:pfmerge newkey key1 key2

八、地理位置

1、存储经纬度,用于计算距离

2、写入:geoadd key longitude latitude member

3、查询:geopos key member

4、查询两个member之间的距离:geodist key member1 member2 m/km/mi/ft

5、查询指定位置指定半径范围内的地理位置信息集合:georadius key logitude latitude radius m/km/mi/ft [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key][storedist key]

①withcoord:返回结果中包含经纬度

②withdist:返回结果中包含距离中心节点的距离

③withhash:返回解雇中包含geohash

④count count:指定返回结果的数量

⑤asc|desc:返回结果按照距离中心点的距离升序/降序排列

⑥store newkey:将返回结果存于newkey

⑦storedist newkey:将返回结果距离中心点的距离存于newkey

6、删除(同有序集合的方法):zrem key member

posted @ 2020-09-07 19:53  专业搬砖人士  阅读(282)  评论(0)    收藏  举报