Redis进阶

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 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> 
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
NoSQL Java Redis
Redis进阶-lua脚本
Redis进阶-lua脚本
65 0
|
4月前
|
存储 NoSQL Java
Redis进阶-细说分布式锁
Redis进阶-细说分布式锁
49 0
|
4月前
|
NoSQL Redis
Redis进阶-bind参数详解
Redis进阶-bind参数详解
87 0
|
4月前
|
NoSQL Java Redis
Redis进阶-Jedis以及Spring Boot操作 Redis 5.x Cluster
Redis进阶-Jedis以及Spring Boot操作 Redis 5.x Cluster
53 0
|
4月前
|
NoSQL 算法 Redis
Redis进阶-Redis对于过期键的三种清除策略
Redis进阶-Redis对于过期键的三种清除策略
56 0
|
4月前
|
消息中间件 NoSQL 算法
Redis进阶-Stream多播的可持久化的消息队列
Redis进阶-Stream多播的可持久化的消息队列
85 1
|
4月前
|
存储 缓存 NoSQL
Redis进阶-Redis集群原理剖析及gossip协议初探
Redis进阶-Redis集群原理剖析及gossip协议初探
60 0
|
4月前
|
存储 缓存 算法
Redis进阶-分布式存储 Sequential partitioning & Hash partitioning
Redis进阶-分布式存储 Sequential partitioning & Hash partitioning
39 0
|
4月前
|
NoSQL 网络安全 Redis
Redis进阶-5.x 单节点 及Redis Cluster 3主3从集群部署
Redis进阶-5.x 单节点 及Redis Cluster 3主3从集群部署
54 0
|
4月前
|
NoSQL Redis
Redis进阶- Redisson分布式锁实现原理及源码解析
Redis进阶- Redisson分布式锁实现原理及源码解析
79 0