Redis多功能

一、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

  1. "pmessage" # 这是从模式接收到的消息
  2. "news::[ie]t" # 被匹配的模式
  3. "news::it" # 消息的来源频道(被匹配的频道)
  4. "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列表实现) ,
  • 先进先出的队列固定长度,
  • 保存在内存重启后会清空

慢查询相关配置:

  1. 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

注:清空慢查询队列

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容