一、慢查询
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