06- Redis六

Redis六

1. Redis 管道技术—Pipeline

管道技术(Pipeline)是客户端提供的一种批处理技术,用于一次处理多个 Redis 命令,从而提高整个交互的性能。

通常情况下 Redis 是单行执行的,客户端先向服务器发送请求,服务端接收并处理请求后再把结果返回给客户端,这种处理模式在非频繁请求时不会有任何问题。

但如果出现集中大批量的请求时,因为每个请求都要经历先请求再响应的过程,这就会造成网络资源浪费,此时就需要管道技术来把所有的命令整合一次发给服务端,再一次响应给客户端,这样就能大大的提升了 Redis 的响应速度。

普通命令模式

在这里插入图片描述
管道模式

在这里插入图片描述
使用管道 执行10000条命令
在这里插入图片描述

import redis
import time


r = redis.StrictRedis(host='127.0.0.1',port= 6379)

t1 = time.time()
# 创建管道
pl = r.pipeline()
for i in range(10000):
    pl.set('k-%s' %i,'v-%s' %i)

# 执行
pl.execute()

t2 = time.time()
print(t2-t1)

在这里插入图片描述

在这里插入图片描述

不使用管道

import redis
import time


r = redis.StrictRedis(host='127.0.0.1',port= 6379)

t1 = time.time()

for i in range(10000):
    r.set('z-%s' %i,'x-%s' %i)

t2 = time.time()
print(t2-t1)

在这里插入图片描述
使用管道和不使用管道的时间对比

使用
在这里插入图片描述

不使用
在这里插入图片描述

明显管道更快

管道技术解决了什么问题?

管道技术解决了多个命令集中请求时造成网络资源浪费的问题,加快了 Redis 的响应速度,让 Redis 拥有更高的运行速度。但要注意的一点是,管道技术本质上是客户端提供的功能,而非 Redis 服务器端的功能。

管道技术需要注意的事项
管道技术虽然有它的优势,但在使用时还需注意以下几个细节:

发送的命令数量不会被限制,但输入缓存区也就是命令的最大存储体积为 1GB,当发送的命令超过此限制时,命令不会被执行,并且会被 Redis 服务器端断开此链接;
如果管道的数据过多可能会导致客户端的等待时间过长,导致网络阻塞;
部分客户端自己本身也有缓存区大小的设置,如果管道命令没有没执行或者是执行不完整,可以排查此情况或较少管道内的命令重新尝试执行。

2. 查询附近的人-GEO

我们所处的任何位置都可以用经度和纬度来标识,经度的范围 -180 到 180,纬度的范围为 -90 到 90。纬度以赤道为界,赤道以南为负数,赤道以北为正数;经度以本初子午线(英国格林尼治天文台)为界,东边为正数,西边为负数。

Redis 在 3.2 版本中增加了 GEO 类型用于存储和查询地理位置,关于 GEO 的命令不多,主要包含以下 6 个:

  • geoadd:添加地理位置
  • geopos:查询位置信息
  • geodist:距离统计
  • georadius:查询某位置内的其他成员信息
  • geohash:查询位置的哈希值
  • zrem:删除地理位置 下面我们分别来看这些命令的使用。

基础使用

添加地理位置
我们先用百度地图提供的经纬度查询工具,地址:http://api.map.baidu.com/lbsapi/getpoint/index.html

在这里插入图片描述
找了以下 4 个地点,添加到 Redis 中

天安门:116.404269,39.913164 月坛公园:116.36,39.922461 北京欢乐谷:116.499705,39.874635 香山公园:116.193275,39.996348

geoadd site 116.404269 39.913164 tianan
(integer) 1
geoadd site 116.36 39.922461 yuetan
(integer) 1
geoadd site 116.499705 39.874635 huanle
(integer) 1
geoadd site 116.193275 39.996348 xiangshan
(integer) 1

在这里插入图片描述

重点参数说明如下

  • longitude 表示经度
  • latitude 表示纬度
  • member 是为此经纬度起的名字 此命令支持一次添加一个或多个位置信息。

查询位置信息

geopos site tianan
1) 1) "116.40541702508926392"
   2) "39.91316289865137179"

在这里插入图片描述
相关语法

geopos key member [member ...]

此命令支持查看一个或多个位置信息。

距离统计

127.0.0.1:6379> geodist site tianan yuetan km
"3.9153"

在这里插入图片描述

相关语法

geodist key member1 member2 [unit]

unit 参数表示统计单位,它可以设置以下值:

  • m:以米为单位,默认单位;
  • km:以千米为单位;
  • mi:以英里为单位;
  • ft:以英尺为单位。

查询某位置内的其他成员信息
georadius

在这里插入图片描述
此命令的意思是查询天安门(116.405419,39.913164)附近 5 公里范围内的成员列表。

相关语法

1. WITHCOORD
说明:返回满足条件位置的经纬度信息。

在这里插入图片描述

2. WITHDIST
说明:返回满足条件位置与查询位置的直线距离。

在这里插入图片描述

3. WITHHASH
说明:返回满足条件位置的哈希信息
在这里插入图片描述

4. COUNT count
说明:指定返回满足条件位置的个数。

例如,指定返回一条满足条件的信息,代码如下:
在这里插入图片描述
5.ASC|DESC
说明:从近到远|从远到近排序返回。
在这里插入图片描述

删除地理位置

zrem site xiaoming

在这里插入图片描述
相关语法:

 zrem key nember [nember ...]

此命令支持查询一个或多个地址的哈希值。
在这里插入图片描述

应用场景
Redis 中的 GEO 经典使用场景如下:

  • 查询附近的人、附近的地点等;
  • 计算相关的距离信息。

小结
GEO 是 Redis 3.2 版本中新增的功能,只有升级到 3.2+ 才能使用,GEO 本质上是基于 ZSet 实现的,这点在 Redis 源码找到相关信息,我们可以 GEO 使用实现查找附近的人或者附近的地点,还可以用它来计算两个位置相隔的直线距离。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值