Redis 进阶(订阅与发布、HyperLogLog、GEO)

1. Redis 订阅与发布

1.1 什么是订阅与发布
  • 什么是订阅与发布?Redis 订阅与发布是一种消息通信模式,发布者发送消息,订阅者接收消息。
  • Redis 主要是将消息发布者和消息订阅者之间进行耦连,发布与订阅不仅解决了消息的发布者与订阅者之间直接的代码级别的耦合,也解决了两者之间在物理部署上的耦合。
  • Redis 在订阅者与发布者之间起到了消息路由的功能。订阅者可以通过 subscribepsubscribe 命令向 Redis server 订阅自己感兴趣的消息类型
  • Redis 将消息类型称为通道,当发布者通过 publish 命令向 Redis server 发布特定类型的消息时,订阅该消息类型的全部客户端都会受到此消息。这里需要注意的是,消息的传递是多对多的,一个客户端可以订阅多个通道,也可以向多个通道发布消息。
1.2 订阅与发布常用命令
序号 命令 格式 解释
1 psubscribe psubscribe pattern [pattern …] 订阅一个或多个符合给定模式的频道
2 publish publish channel message 将信息发送到指定的频道
3 subscribe subscribe channel [channel …] 订阅给定的一个或多个频道的信息
4 punsubscribe punsubscribe [pattern [pattern …]] 退订所有给定模式的频道
5 unsubscribe unsubscribe [channel [channel …]] 指退订给定的频道
# 演示代码
## subscribe
# 进入终端 1 :
subscribe	// 返回一个由三个元素构成的多块响应
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1
// 第一个元素是成功订阅到的响应命令
// 第二个元素是提供消息的频道
// 第三个元素是订阅到的频道的数量
// 因为我们这里只订阅了 mychannel 频道,所以这里返回一个 “1”

## publish
// 将消息发送到指定的频道
# 进入终端 2 :
publish mychannel hello	// 返回: (integer) 1

# 此时切换到终端 1,返回:
1) "message"
2) "mychannel"
3) "hello"
// 第一个元素 "message" 表示另一个客户端(终端 2)发送的结果
// 第二个元素 "mychannel" 是消息来源的频道
// 第三个元素 "hello" 消息信息

## psubsrcibe
// 订阅 1 个或多个给定模式的频道
// Redis 的订阅和发布支持模式匹配
// 客户端可以根据自己的喜好制定不同的模式风格
// 以便接收所有来自匹配模式所给定的频道的信息

// 之前的 Redis 客户端用 Ctrl + C 退出后要重新进入
# 进入终端 1 :
psubscribe mychannel*	// 返回
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "mychannel*"
3) (integer) 1

# 进入终端 2 :
publish mychannel5 sports	// 返回: (integer) 1

# 此时切换到终端 1,返回:
1) "pmessage"
2) "mychannel*"
3) "mychannel5"
4) "sports"
// 订阅端返回了四个元素的多块响应快

## punsubscribe && unsubscribe
// 不能用于 redis-cli 客户端中
// 因为在 redis-cli 客户端中运行订阅之后,客户端处于阻塞模式,只能通过 Ctrl + C 退出订阅模式

// 当用 PHP 进行 Redis 开发时,此时订阅相应的信道之后,并且让订阅服务在后台运行。
// 当需要取消订阅的时候,就可以使用 punsubscribe && unsubscribe 取消当前客户端订阅的信道。

2. Redis HyperLogLog 及操作

2.1 Redis HyperLogLog 的用途
  • Redis 是随着现代的发展不断的完善和改进的。Redis 随着版本的升级增加了很多的内容,其中之一就是 HyperLogLog。
  • HyperLogLog 是在 Redis 2.8 版本中增加的。是用来做计数统计的。可以非常省内存的去统计各种计数,比如注册的 ip 数,每日访问 ip 数,在线用户数等等。
  • 这个数据结构的特点就是,可以比较准确的估算出你要统计的数量。但是这无法知道具体统计的内容是什么。比如我们统计每日访问 ip 数,可以获得当前访问 ip 的总数量,但是没法知道这些 ip 都是什么。要统计 ip 的内容,可以配合集合来处理。这样不仅可以知道 ip 的数量,也可以获得详细的 ip 列表
  • HyperLogLog 的优点就是,再输入元素的数量或者体积非常大的时候,计算基数所需要的空间是固定的而且是很小的。在 Redis 中,每个 HyperLogLog 键只需要花费 12 KB 的内存,就可以计算接近 2^64 个不同元素的基数。同时由于 HyperLogLog 是基于基数估算的算法,也就意味着其结果带有一定的误差,误差是 0.81%。因此 HyperLogLog 主要用于对准确性要求不是很重要的场所。
  • 可以节省多少内存?举例说明,每个 ipv4 地址需要消耗 15 个字节,如果网站日访问量能够达到 100 万个,那需要 15MB 的内存。如果是一个亿,那就要 1.5 G 的内存、一个月就要 45 G。随着集合记录的越来越多,消耗的内存也会越来越多。但是使用 HyperLogLog 的话,一天12k,一个月 360k。
2.2 Redis HyperLogLog 常用命令
序号 命令 格式 解释
1 pfadd pfadd key element 添加指定元素到HyperLogLog中
2 pfcount pfcount key 返回给定HyperLogLog的技术估算值
3 pfmerge pfmerge deskkey sourcekey 将多个HyperLogLog合并为一个HyperLogLog
# 演示代码
## pfadd
// 添加指定元素到HyperLogLog中,在执行命令之后,HyperLogLog 内部的结构将被更新并有所反馈
// 如果执行之后 HyperLogLog 内部的基数发生了变化,那么就会返回 1,否则返回 0
// 这个命令还有一个神奇的地方,就是可以只有键,没有值。
// 意思就是只创建空的键不放值。如果这个键存在,不做任何事情,则返回 0,不存在的话,创建返回 1。
pfadd ip:201907 1.1.1.1 2.2.2.2 3.3.3.3				// 返回 (integer) 1,说明内部基数发生了变化。
pfadd ip:201907 2.2.2.2 3.3.3.3 4.4.4.4 5.5.5.5		// 返回 (integer) 1
pfcount ip:201907		// 返回 (integer) 5。去重
pfadd ip:201907 2.2.2.2	// 返回 (integer) 0

## pfcount
// 返回给定HyperLogLog的技术估算值。如果键不存在,则返回 0 。
// 当做用于多个键的时候,返回这些键的并集估算值,类似于把这些键都给合并好了之后再调用这个命令输出
pfadd ip:201908 1.1.1.1 2.2.2.2 3.3.3.3		// 返回 (integer) 1
pfadd ip:201909 1.1.1.1 4.4.4.4 5.5.5.5		// 返回 (integer) 1
pfcount ip:201908 ip:201909					// 返回 (integer) 5

## pfmerge
// 将多个 HyperLogLog 合并为一个 HyperLogLog
// 合并后的估算计数也近似于所有 HyperLogLog 估算基数的并集
// 这个命令的第一个参数为目标键,剩下的为要合并的 HyperLogLog
// 如果目标键不存在,则创建后在执行合并
pfadd ip:201909 1.1.1.1 2.2.2.2 3.3.3.3			// 返回 (integer) 1
pfadd ip:201910 1.1.1.1 4.4.4.4 5.5.5.5 6.6.6.6	// 返回 (integer) 1
pfmerge ip2019 ip:201909 ip:201910				// 返回 OK
pfcount ip2019									// 返回 (integer) 6

3. Redis GEO 及操作

3.1 什么是 Redis GEO
  • GEO 是地理空间的缩写,Redis GEO 是将特定的地理空间位置(比如经度、维度、名称等)添加到指定的 key中,这些数据将会存储到 zsets 里面
  • 这样做的目的是为了方便使用命令对数据进行半径的查询等操作
  • Redis GEO 有自己标准的格式,经度必须在纬度之前,Redis 有效的经度范围是从 -180 度到 180度,有效纬度是从 -85.05112778 度到 85.05112878 度。当坐标位置超出上述范围的时候,该命令就会返回错误。
  • Redis GEO 模型存在一定的偏差。偏差最大到 0.5%
3.2 Redis GEO 常用命令
序号 命令 格式 解释
1 geoadd geoadd key longitude latitude member 增加地理位置的坐标
2 geodist geodist key member1 member2 获取两个地理位置的距离
3 geopos geopos key member 获取地理位置的坐标
4 georadius georadius key longitude latitude radius 根据给定经纬度坐标获取指定范围内的地理位置集合
5 georadiusbymember georadiusbymember key member radius 根据给定地理位置获取制定范围内的地理位置集合
6 geohash geohash key member 获取某个地理位置的geohash值

你可能感兴趣的:(Linux,缓存技术,Redis,Linux,Redis,Redis订阅与发布,RedisGEO)