一、pipeline流水线功能
Redis 的流水线功能允许客户端一次将多个命令请求发送给服务器,并将被执行的多个命令请求的结果在一个命令回复中全部返回 给客户端,使用这个功能可以有效地减少客 户端在执行多个命令时需要与服务器进行通信的次数,多个命令执行的数据会以列表的形式返回
redigo客户端使用Send和Do方法来实现流水线事务
c.Send( “MULTI”)
c.Send(“ INCR”,“ foo”)
c.Send(“ INCR”,“ bar”)
r,err:= c.Do(“ EXEC”)
fmt.Println(r)//打印[1,1]
1.与M操作的对比
pipeline:多条命令发送到服务端多条命令在队列中排队不是原子操作,返回的结果是顺序的
M操作:是原子操作
2.注释:
pipeline执行的命令不要过多,可以拆分多个pipeline执行
pipeline只能作用在一个redis节点上
二、发布与订阅功能
- 发布者(publisher):发布消息的客户端
- 频道(channel):构建在服务器内部,负责接收发布者发送的消息,并将消息 转发给频道的订阅者
- 模式(pattern):构建在服务器内部,负责对频道进行匹配,当被匹配的 频道接到消息时,模式也会将消息转发给模式的订阅者
- 订阅者(subscriber):通过订阅频道或者模式来获取消息的客户端,每个频道或者模式都可以有任意多个订阅者
订阅频道
SUBSCRIBE channel [channel …] // 订阅频道
示例 :
SUBSCRIBE news::it
订阅模式
PSUBSCRIBE pattern [pattern...] // 订阅一个或多个模式
订阅一个或多个模式, pattern 参数可以包含 glob 风格的匹配符,比如:
- news::* 模式可以匹配 news::bussiness 、 news::it 、 news::sports::football 等频道;
- news::[ie]t 模式可以匹配 news::it 频道或者 news::et 频道;
- news::?t 模式可以匹配 news::it 、 news::et 、 news::at 等频道;
示例 :
PSUBSCRIBE news::[ie]t
- "pmessage" # 这是从模式接收到的消息
- "news::[ie]t" # 被匹配的模式
- "news::it" # 消息的来源频道(被匹配的频道)
- "hello" # 消息正文
退订频道与退订模式
UNSUBSCRIBE [channel [channel …]] // 退订指定频道
PUNSUBSCRIBE [pattern [pattern…]] // 退订指定模式
发布消息
PUBLISH channel message
将消息发送至指定的频道,命令返回接收到消息的 订阅者数量。
查看被订阅的频道
PUBSUB CHANNELS [pattern]
- 列出目前至少有一个 订阅者的频道
- 如果给定了可选的 pattern 参数,那么只列出与模式相匹配的 频道
查看频道的订阅者数量
PUBSUB NUMSUB [channel-1 ... channel-N]
- 返回给定频道的订阅者数量
查看被订阅模式的数量
PUBSUB NUMPAT
- 返回服务器目前被订阅的模式数量
三、事务
Redis 的事务功能允许用户将多个命令包裹起来,然后一次性地、按 顺序地执行被包裹的所有命令。在事务执行的过程中,服务器不会中断事务而改去执行其他命令请求,只有在事务包裹的所有命令都被执行完毕之后,服务器才会去处理其他命令请求
通过事务, 我们可以让 Redis 一次性地执行多个命令, 并且确保事务中的命令要么就全部都 执行,要么就一个都不执行
MULTI // 开始一个新的事务
DISCARD // 放弃事务
EXEC // 执行事务中的所有命令
redis> MULTI # 开始一个事务
OK
redis> SET msg "hello world" # 将这个 SET 命令放入事务队列
QUEUED
redis> EXPIRE msg 10086 # 将这个 SET 命令放入事务队列
QUEUED
按照命令被入队到事务队列中的顺序,执行事务队列中的所有命令。命令的复杂度为队列中所有命令的复杂度之和。命令的返回值是一个列表,列表里包含了事 务队列中所有被执行命令的返回值
与流水线对比:
- 流水线 确保多条命令会被一起 发送
- 事务 确保多条命令会被一起 执行
使用 WATCH 来防止竞争条件:
def ZDECRBY(key, decrment, member):
# 监视输入的有序集合
WATCH key
# 取得元素当前的分值
old_score = ZSCORE key member
# 使用当前分值减去指定的减量,得出新的分值
new_score = old_score - decrment
# 使用事务包裹 ZADD 命令
# 确保 ZADD 命令只会在有序集合没有被修改的情况下执行
MULTI
ZADD key new_score member # 为元素设置新分值,覆盖现有的分值
EXEC
四、BitMap位图
位图可以直接操作数据保存的二进制数据位的值
getbit key offset
注:对key所存储的字符串值,获取指定偏移量上的位
setbit key offset value
注:对key所存储的字符串值,设置或清除指定偏移量上的位(bit)返回值为该位在setbit之前的值,value只能取0或1,offset从0开始
bitcount key [start end]
注:获取位图指定范围中位值为1的个数,如果不指定start与end,则取所有
bitpos key tartget [start end]
注:计算位图指定范围第一个等于target值的偏移量(位置)
- 找不到返回-1
- start与end没有设置,则取全部
- targetBit只能取0或者1
使用场景:统计用户每日的登录。每一位标识一个用户ID,当某个用户登录,就在bitmap中把标识此用户的位设置为1
五、HyperLogLog
基于算法,使用极小空间完成独立数量统计的功能,本质还是一个字符串
pfadd key element1 [element2...]
注:向HyperLogLog中添加元素
pfcount key1 [key2...]
注:计算HyperLogLog的独立总数
pfmerge hyperloglogKey key1 [key2...]
注:合并多个hyperLogLog到hyperloglogKey中
六、GEO
功能:存储经纬度、计算两地距离、范围计算等,基于ZSet实现
geoadd key longitude latitude elementName [lon lat elementName...]
注:增加经纬度元素
- longitude :经度
- latitude : 纬度
- member : 标识信息
geopos key element1 [element2...]
注:获取经纬度元素
geodist key member1 member2 [unit]
注:获取两个经纬度元素的距离
unit取值范围
- m(米,默认)
- km(千米)
- mi(英里)
- ft(英尺)
georadius key longitude latitude unit [withcoord] [withdist] [withhash] [COUNT count] [sort] [store key] [storedist key]
注:以给定的经纬度为中心,返回包含的位置元素当中,与中心距离不超过给定最大距离的所有位置元素。
- unit取值范围
- m(米)
- km(千米)
- mi(英里)
- ft(英尺)
- withcoord:将位置元素的经度与纬度也一并返回
- withdist:在返回位置元素的同时,将距离也一并返回。距离的单位和用户给定的范围单位保持一致
- withhash:以52位的符号整数形式,返回位置元素经过geohash编码的有序集合分值。用于底层应用或调试,实际作用不大。
- sort取值范围
- asc:根据中心位置,按照从近到远的方式返回位置元素
- desc:根据中心位置,按照从远到近的方式返回位置元素
- store key:将返回结果而的地理位置信息保存到指定键
- storedist key:将返回结果距离中心节点的距离保存到指定键
georadiusbymember key member radius unit [withcoord][withdist][withhash][COUNT count][sort][store key][storedist key]
注:以给定的元素为中心,返回包含的位置元素当中,与中心距离不超过给定最大距离的所有位置元素。
- unit取值范围
- m(米)
- km(千米)
- mi(英里)
- ft(英尺)
- withcoord:将位置元素的经度与纬度也一并返回
- withdist:在返回位置元素的同时,将距离也一并返回。距离的单位和用户给定的范围单位保持一致
- withhash:以52位的符号整数形式,返回位置元素经过geohash编码的有序集合分值。用于底层应用或调试,实际作用不大。
- sort取值范围
- asc:根据中心位置,按照从近到远的方式返回位置元素
- desc:根据中心位置,按照从远到近的方式返回位置元素
- store key:将返回结果而的地理位置信息保存到指定键
- storedist key:将返回结果距离中心节点的距离保存到指定键
七、Redis慢查询
- 查询超过设置时间进入先进先出的队列(使用redis列表实现) ,
- 先进先出的队列固定长度,
- 保存在内存重启后会清空
慢查询相关配置:
- slowlog-max-len
它决定了慢查询日志最多能保存多少条日志,slow log本身是一个内存中的FIFO队列,当队列大小超过slowlog-max-len时,最旧的一条日志将被删除,而最新的一条日志加入到slow log中。
- 默认值:128(通常设置1000左右)
- 支持动态配置
2.slowlog-log-slower-than
它决定要对执行时间大于多少微妙(microsecond , 1秒=1,000,000 微妙)的查询进行记录
- 默认值:10000 (10毫秒,通常设置1ms)
- slowlog-log-slower-than = 0 ,记录所有命令
- slowlog-log-slower-than < 0 , 不记录任何命令
- 支持动态配置
动态配置:
config set slowlog-max-len 1000
config set slowlog-log-slower-than 1000
相关命令:
slowlog get [n]
注:获取慢查询列表中的慢查询信息
- n:获取出多少条慢查询数据信息
slowlog len
注:获取慢查询队列长度
slowlog reset
注:清空慢查询队列