Redis核心技术与实战
蒋德钧
中科院计算所副研究员
新⼈⾸单¥19.9
7028 人已学习
课程目录
已更新 17 讲 / 共 50 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 这样学Redis,才能技高一筹
免费
基础篇 (10讲)
01 | 基本架构:一个键值数据库包含什么?
02 | 数据结构:快速的Redis有哪些慢操作?
03 | 高性能IO模型:为什么单线程Redis能那么快?
04 | AOF日志:宕机了,Redis如何避免数据丢失?
05 | 内存快照:宕机后,Redis如何实现快速恢复?
06 | 数据同步:主从库如何实现数据一致?
07 | 哨兵机制:主库挂了,如何不间断服务?
08 | 哨兵集群:哨兵挂了,主从库还能切换吗?
09 | 切片集群:数据增多了,是该加内存还是加实例?
10 | 第1~9讲课后思考题答案及常见问题答疑
实践篇 (4讲)
11 | “万金油”的String,为什么不好用了?
12 | 有一亿个keys要统计,应该用哪种集合?
13 | GEO是什么?还可以定义新的数据类型吗?
14 | 如何在Redis中保存时间序列数据?
加餐篇 (2讲)
加餐(一)| 经典的Redis学习资料有哪些?
加餐(二)| Kaito:我是如何学习Redis的?
Redis核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

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

蒋德钧 2020-09-04
你好,我是蒋德钧。
第 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Redis核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥19.9
立即订阅
登录 后留言

精选留言(12)

  • 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
    7
    35
  • 严格来说,根据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
  • 小文同学
    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
  • "有的编码值虽然在大小上接近,但实际对应的方格却距离比较远。所以,为了避免查询不准确问题,我们可以同时查询给定经纬度所在的方格周围的 4 个或 8 个方格"。 可是这4个或8个里还是包含了这个有问题的方格,实践中如何剔除掉这个坏的方格呢?
    2020-09-07
    1
  • 王 慈
    老师,这种通过更改源码实现自定义类型和功能的方式,比较好的处理redis版本更新的方法有什么呢?比如在v0.1稳定版上实现了功能,后续出现v0.2稳定版了是否可以升级呢?
    2020-09-07
  • 迷迷徒
    geohash真是妙呀
    2020-09-07
  • d
    老师,这块的代码改动能否给个fork url 看下?
    2020-09-06
  • MClink
    老师后面会带我们去看源码吗?
    2020-09-05
  • 一步
    Redis 键值对中的每一个值都是用 RedisObject 保存
    -------------------------
    那么 redis 的键用什么保存的呢? 也是 RedisObject 吗?

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

    2020-09-05
    1
  • 小袁
    啥经纬度的位信息要交替存储,可以不交替存储么?原文只说了相邻编码可能在是相邻地区,但不相邻编码可以是相邻地区吧。既然这样,能否用算法直接算出相邻的八格的编码呢,然后直接根据权重查。
    2020-09-04
    1
  • 马以
    现在很多公司如果没有特殊场景,都是一个String走天下~
    2020-09-04
  • 那时刻
    请问老师,redisobject里的 refcount:记录了对象的引用计数,这个对象引用计数在什么情况下发生呢?具体使用场景是什么?
    2020-09-04
收起评论
12
返回
顶部