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

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

你好,我是蒋德钧。
第 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 核心技术与实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(42)

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

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

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

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

    2
    11
  • 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数据结构和位运算,可以解决业务层缓存穿透的问题,而且内存占用非常小,操作非常高效。
    33
    362
  • 注定非凡
    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,留言区的收获
    2
    68
  • 马以
    现在很多公司如果没有特殊场景,都是一个String走天下~
    7
    43
  • 迷迷徒
    geohash真是妙呀
    1
    16
  • Geek2014
    想问一个扩展的问题,还请老师解答。 因为车辆是不断移动的,那如何维护车辆位置的GEOHASH呢。
    10
    11
  • 夏天
    给大家补一个 ElasticSearch 的 geo_distance 也可以用来做距离计算 按性能而言,肯定是 Redis 好。 ElasticSearch 对于搜索,更灵活,支持功能更多。 设计方案可以考虑
    7
  • 小文同学
    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
    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度。
    1
    4
收起评论
显示
设置
留言
42
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部