Redis 核心技术与实战
蒋德钧
中科院计算所副研究员
81696 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 53 讲
开篇词 (1讲)
实践篇 (28讲)
Redis 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

13 | GEO是什么?还可以定义新的数据类型吗?

开发新类型的命令操作
开发新类型的创建和释放函数
在RedisObject的type属性中,增加这个新类型的定义
定义新数据类型的底层结构
*ptr
refcount
lru
encoding
type
GeoHash编码方法
GEORADIUS命令
GEOADD命令
GeoHash编码
Sorted Set类型
Hash集合类型
经纬度存取特点
开发一个新的数据类型
Redis的基本对象结构
GEORADIUS命令
GEOADD命令
底层结构
应用场景
操作方法
底层结构
如何自定义数据类型?
如何操作GEO类型?
面向LBS应用的GEO数据类型
GEO是什么?
参考文章

该思维导图由 AI 生成,仅供参考

你好,我是蒋德钧。
在第 2 讲中,我们学习了 Redis 的 5 大基本数据类型:String、List、Hash、Set 和 Sorted Set,它们可以满足大多数的数据存储需求,但是在面对海量数据统计时,它们的内存开销很大,而且对于一些特殊的场景,它们是无法支持的。所以,Redis 还提供了 3 种扩展数据类型,分别是 Bitmap、HyperLogLog 和 GEO。前两种我在上节课已经重点介绍过了,今天,我再具体讲一讲 GEO。
另外,我还会给你介绍开发自定义的新数据类型的基本步骤。掌握了自定义数据类型的开发方法,当你面临一些复杂的场景时,就不用受基本数据类型的限制,可以直接在 Redis 中增加定制化的数据类型,来满足你的特殊需求。
接下来,我们就先来了解下扩展数据类型 GEO 的实现原理和使用方法。

面向 LBS 应用的 GEO 数据类型

在日常生活中,我们越来越依赖搜索“附近的餐馆”、在打车软件上叫车,这些都离不开基于位置信息服务(Location-Based Service,LBS)的应用。LBS 应用访问的数据是和人或物关联的一组经纬度信息,而且要能查询相邻的经纬度范围,GEO 就非常适合应用在 LBS 服务的场景中,我们来看一下它的底层结构。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Redis中的GEO数据类型是一种扩展数据类型,适用于处理与地理位置相关的数据,特别适合于LBS(基于位置的服务)应用。该数据类型的底层结构是基于Sorted Set实现的,通过GeoHash编码来保存经纬度信息。使用GeoHash编码方法可以高效地对经纬度进行比较,将一组经纬度编码为一个值,以便在Sorted Set中进行范围查询。通过GEO类型,可以实现快速查找附近的位置信息,例如附近的餐馆或车辆。操作GEO类型时,常用的命令包括GEOADD和GEORADIUS,用于将经纬度信息存入集合并进行范围查询。此外,文章还介绍了如何开发自定义数据类型,以满足特殊需求,为读者提供了深入了解Redis扩展数据类型的终极版的知识。通过本文,读者可以快速了解GEO数据类型的特点和操作方法,以及如何自定义数据类型来满足特殊需求。文章还介绍了RedisObject的内部组成,以及开发新数据类型的具体步骤,包括定义底层结构、在RedisObject的type属性中增加新类型的定义、开发新类型的创建和释放函数以及命令操作。通过这些内容,读者可以深入了解Redis的扩展数据类型,为实际应用提供了丰富的技术支持。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Redis 核心技术与实战》
,新⼈⾸单¥68
立即购买
登录 后留言

全部留言(42)

  • 最新
  • 精选
  • 范闲
    BloomFilter用的比较多。缓存穿透可以用这个防止

    作者回复: 是的,布隆过滤器可以帮助判断数据是否在缓存中。

    2020-10-26
    26
  • 奕
    Redis 键值对中的每一个值都是用 RedisObject 保存 ------------------------- 那么 redis 的键用什么保存的呢? 也是 RedisObject 吗?

    作者回复: 是的,Redis的键也是用RedisObject保存的。

    2020-09-05
    2
    14
  • Kaito
    Redis也可以使用List数据类型当做队列使用,一个客户端使用rpush生产数据到Redis中,另一个客户端使用lpop取出数据进行消费,非常方便。但要注意的是,使用List当做队列,缺点是没有ack机制和不支持多个消费者。没有ack机制会导致从Redis中取出的数据后,如果客户端处理失败了,取出的这个数据相当于丢失了,无法重新消费。所以使用List用作队列适合于对于丢失数据不敏感的业务场景,但它的优点是,因为都是内存操作,所以非常快和轻量。 而Redis提供的PubSub,可以支持多个消费者进行消费,生产者发布一条消息,多个消费者同时订阅消费。但是它的缺点是,如果任意一个消费者挂了,等恢复过来后,在这期间的生产者的数据就丢失了。PubSub只把数据发给在线的消费者,消费者一旦下线,就会丢弃数据。另一个缺点是,PubSub中的数据不支持数据持久化,当Redis宕机恢复后,其他类型的数据都可以从RDB和AOF中恢复回来,但PubSub不行,它就是简单的基于内存的多播机制。 之后Redis 5.0推出了Stream数据结构,它借鉴了Kafka的设计思想,弥补了List和PubSub的不足。Stream类型数据可以持久化、支持ack机制、支持多个消费者、支持回溯消费,基本上实现了队列中间件大部分功能,比List和PubSub更可靠。 另一个经常使用的是基于Redis实现的布隆过滤器,其底层实现利用的是String数据结构和位运算,可以解决业务层缓存穿透的问题,而且内存占用非常小,操作非常高效。
    2020-09-04
    34
    372
  • 注定非凡
    1,作者讲了什么? Redis的三种扩展数据类型之一:GEO,一种可以实现LBS服务的数据结构 2,作者是怎么把这事给讲明白的? 1,提出一个真问题:打车软件是怎么基于位置提供服务的 2,通过GEO原理讲解,说明GEO为什么可以 3,作者为了把这事给讲清楚,讲了那些要点?有哪些亮点? 1,亮点1:GEO的原理,这个是我之前所不知道的,学完后对GEO有了一些认知 2,亮点2:Redis居然支持自定义数据存储结构,这打开了我的眼界 3,要点1:GEO的底层实现,是sortSet,元素是车辆信息,权重是车辆经纬度转换过来的float值 4,要点2:GEOHash编码,基本原理“二分区间,区间编码”(二分法的应用,将一个值编码成N位的二进制值) 5,要点3:GEO使用GEOHash编码后,将经纬度,按照纬奇经偶位分别填充组合,得到一个车辆的经纬度编码值 6,要点4:GEOHash编码实现的效果是将一个空间分割成为一个个方块,可以实现LBS服务(但编码值相近,不一定位置相近) 4,对于作者所讲,我有哪些发散性思考? ①:这一篇讲了通过Redis的GEO数据类型可以实现LBS服务,让我体验到了算法的巧妙应用带来的巨大便利(这应是科技让生活更美好的实例)。 ②:不过,我觉得最大的惊喜在于作者介绍了如何自定义一种新的数据类型,虽然我尚未掌握开发新数据类型的能力。 ③:通过作者的讲解,拓宽了我了见识,这让我体验到了购买专栏的价值(如果都是搜索引擎能解决的事,何必买专栏)。 ④:作者细致的讲解开发过程,也让我对Redis的数据结构,RedisObjecti有了进一步认识(面向对象等) 5,在未来的那些场景中,我能够使用它? redis采用的GEOHash算法,貌似可以协助我们处理分省的一些业务 6,留言区的收获
    2020-09-17
    2
    68
  • 马以
    现在很多公司如果没有特殊场景,都是一个String走天下~
    2020-09-04
    7
    44
  • 迷迷徒
    geohash真是妙呀
    2020-09-07
    1
    16
  • Geek2014
    想问一个扩展的问题,还请老师解答。 因为车辆是不断移动的,那如何维护车辆位置的GEOHASH呢。
    2020-09-10
    10
    11
  • 夏天
    给大家补一个 ElasticSearch 的 geo_distance 也可以用来做距离计算 按性能而言,肯定是 Redis 好。 ElasticSearch 对于搜索,更灵活,支持功能更多。 设计方案可以考虑
    2021-04-23
    9
  • 小文同学
    1、作者讲了什么? GEO 的数据结构原理,及特点。还有编写 Redis 新数据结构和命令的步骤(此部分我没细看)。 2、作者是怎么把事情说明白的? 通过利用 LBS(Location-Based Service)  位置信息服务 来说引入 GEO 这个数据结构如何编码地理位置的经纬度信息,写成一个数值,再利用 Sorted Set 进行存储。 3、为了讲明白,作者讲了哪些要点?哪些是亮点? 举例子说明,Hash、Sorted Set 如何无法满足 LBS 服务; 讲述 Geo Hash 的过程(二分区间,区间编码): 将一个数值通过二分拆解,形成一个二叉树结构,得到每层的 bool 值,从而通过N位 bit 对一个数值进行存储。N 越大,精度越高; 将经纬度,分别按照 step1 获得两个 N 位bit,在进行交叉组合,得到一个值,就是 Geo Hash 值。 这个 Geo Hash 值是连续的,但位置不一定是连续的。故需要计算多个经纬度所在的方格,在求得邻居节点的较低,已提高 LBS 准确率。 4、对于作者所讲,我有哪些发散性思考? 车辆的位置信息已经存储在 GEO 集合中了,投入一个 GEO 的值,如何获得它周围的范围值呢? 5、在未来哪些场景,我可以使用它? LBS 服务可以考虑实现它,已和公司的一个上司沟通个,大家就这个问题有了共识。nice
    2020-09-07
    2
    7
  • 晖
    严格来说,根据Redis文档: "There are limits to the coordinates that can be indexed: areas very near to the poles are not indexable. Valid latitudes are from -85.05112878 to 85.05112878 degrees." 所以纬度的极值应该不能到正负90度。
    2020-09-07
    1
    4
收起评论
显示
设置
留言
42
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部