Redis进阶

Redis进阶

在这里插入图片描述

慢查询

  1. 生命周期 在这里插入图片描述

说明:

(1) 慢查询发生在第三阶段 (2) 客户端超时不一定慢查询,单慢查询是客户端超时的一个可能因素


  1. 两个配置

slowlog - max -len

先进先出队列 固定长度 保存在内存内

slowlog - log - slower - than

慢查询阀值(单位:微妙) slowlog-log-slower-than = 0 , 记录所有命令 slowlog-log-slower-than < 0 , 不记录所有命令

其中slowlog-log-slower-than表示slowlog的划定界限,只有query执行时间大于slowlog-log-slower-than的才会定义成慢查询,才会被slowlog进行记录。slowlog-log-slower-than设置的单位是微妙,默认是10000微妙,也就是10ms slowlog-max-len表示慢查询最大的条数,当slowlog超过设定的最大值后,会将最早的slowlog删除,是个FIFO队列




配置方法

  • 默认值:

config get slowlog-max-len = 128 config get slowlog-log-slower-than = 10000

  • 支持动态操作:

config set slowlog-max-len = 1000 config set slowlog-log-slower-than = 1000


  1. 三个命令
  • slowlog get [n] : 获取慢查询队列
  • slowlog len : 获取慢查询队列的长度
  • slowlog reset : 清空慢查询队列
  1. 运维相关

slowlog-max-len 不要设置过大,默认10ms ,通常1ms slowlog-log-slower-than 不要设置过小,通常设置 1000左右 理解命令生命周期 定期持久化慢查询

pipeline

在这里插入图片描述

  1. 什么是流水线

1次 pipeline (n条命令) = 1次网络时间 + n次命令时间 在这里插入图片描述

发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis 客户端可以订阅任意数量的频道。 在这里插入图片描述

类似于 Producer(生产者) -- Consumer(消费者)

  • API

publish (发布)

127.0.0.1:6379> publish sohu:tv "hell world"
(integer) 0  #订阅者个数
 

subcribe(订阅)

127.0.0.1:6379> subscribe sohu:tv
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "sohu:tv"
3) (integer) 1

unsubscribe (取消订阅)

127.0.0.1:6379> unsubscribe sohu:tv
1) "unsubscribe"
2) "sohu:tv"
3) (integer) 0

其他

在这里插入图片描述


Bitmap 位图

BitMap是什么

就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。

Redis中的BitMap

Redis从2.2.0版本开始新增了setbit,getbit,bitcount等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为setbit等命令只不过是在set上的扩展。

127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> 
127.0.0.1:6379> getbit hello 0
(integer) 0
127.0.0.1:6379> getbit hello 1
(integer) 1

  • setbit

给位图指定索引设置值

127.0.0.1:6379> setbit unique 0 1
(integer) 0
127.0.0.1:6379> setbit unique 5 1
(integer) 0
127.0.0.1:6379> setbit unique 11 1
(integer) 0
127.0.0.1:6379> setbit unique 15 1
(integer) 0
127.0.0.1:6379> setbit unique 19 1
(integer) 0

  • getbit 获取位图指定索引的值
127.0.0.1:6379> getbit unique 8
(integer) 0
127.0.0.1:6379> 
127.0.0.1:6379> getbit unique 1
(integer) 0

  • bitcount

获取位图指定范围(start 到 end,如果不指定就获取全部) 位值为1到个数

127.0.0.1:6379> bitcount unique 
(integer) 5
127.0.0.1:6379> bitcount unique 1 3
(integer) 3

  • bitop

做多个Bitmap 的 and (交集)、or(并集)、not(非)、xor(异或)、操作并将结果保存destkey 中

# 求两个位图的并级
127.0.0.1:6379> bitop and unique:and:2016_04_04-2016_04_05 unique
(integer) 3

  • bitpos 计算位图指定范围 (start 到 end、单位为字节,如果不指定就是获取全部)第一个偏移量对应到值等于 targetBit的位置
127.0.0.1:6379> bitpos unique 1
(integer) 0

在这里插入图片描述

HyperLogLog

Redis 在 2.8.9 版本添加了 HyperLogLog 结构。

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

  • API

PFADD key element [element ...]

添加指定元素到 HyperLogLog 中。

127.0.0.1:6379> pfadd 2017_03_06:unique:ids "uuid-1" "uuid-2" "uuid-3"
(integer) 1

PFCOUNT key [key ...] 返回给定 HyperLogLog 的基数估算值。

127.0.0.1:6379> pfcount 2017_03_06:unique:ids
(integer) 3

PFMERGE destkey sourcekey [sourcekey ...] 将多个 HyperLogLog 合并为一个 HyperLogLog

127.0.0.1:6379> pfadd 2017_03_06:unique:ids "uuid-1" "uuid-2" "uuid-3" "uuid-90"
(integer) 1
127.0.0.1:6379> pfmerge 2017_03_06:unique:ids
OK

GEO

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。

在这里插入图片描述

GEOADD

GEOADD key longitude latitude member [longitude latitude member ...]

用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。

127.0.0.1:6379> geoadd cities:locations 116.28  39.55 beijing
(integer) 1
127.0.0.1:6379> geoadd cities:locations 116.28  39.55 tianjin
(integer) 1

geopos:

GEOPOS key member [member ...]

用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。

127.0.0.1:6379> geopos cities:locations beijing
1) 1) "116.28000229597091675"
   2) "39.5500007245470826"

geodist :

GEODIST key member1 member2 [m|km|ft|mi]

用于返回两个给定位置之间的距离。

127.0.0.1:6379> GEODIST cities:locations beijing tianjin
"0.0000"

geohash

GEOHASH key member [member ...]

用于获取一个或多个位置元素的 geohash 值。

127.0.0.1:6379> geohash cities:locations beijing tianjin
1) "wx48ypbe2q0"
2) "wx48ypbe2q0"

georadius、georadiusbymember

georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

georadiusbymember 和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember 的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。

语法:

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

参数说明:

  • m :米,默认单位。
  • km :千米。
  • mi :英里。
  • ft :英尺。
  • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
  • WITHCOORD: 将位置元素的经度和维度也一并返回。
  • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
  • COUNT 限定返回的记录数。
  • ASC: 查找结果根据距离从近到远排序。
  • DESC: 查找结果根据从远到近排序。
127.0.0.1:6379> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km WITHDIST
1) 1) "Palermo"
   2) "190.4424"
2) 1) "Catania"
   2) "56.4413"
127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km WITHCOORD
1) 1) "Palermo"
   2) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) 1) "15.08726745843887329"
      2) "37.50266842333162032"
127.0.0.1:6379> 

127.0.0.1:6379> GEOADD Sicily 13.583333 37.316667 "Agrigento"
(integer) 1
127.0.0.1:6379> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 0
127.0.0.1:6379> GEORADIUSBYMEMBER Sicily Agrigento 100 km
1) "Agrigento"
2) "Palermo"
127.0.0.1:6379> 

end
  • 作者:yxl(联系作者)
  • 发表时间:2020-10-02 12:35
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论