redis数据结构

目录

链接地址

数据结构回顾

image.png

redis除了上面基础5种,还有三种扩展数据结构:

  • bitmap :实际上底层就是用sds保存二进制数字
  • hyperloglog
  • geo

1.GEO

geo(redis3.2以上)的使用场景常用于存储地址的经纬度,底层数据结构为zset,即有序集合sorted set来实现,key存储元素信息,value存储经纬度信息(权重分数),支持按经纬度排序,按范围查找
以添加车辆位置为例,伪代码如下

zadd car:location  车辆ID  经纬度

那么问题来了,经纬度是一组浮点数,包含两个值,显然zadd是无法完成的

116.03   ,  39.02

所以就在zset上面扩展出了geo

geoadd cars:location  116.03 39.02

1.1GEOhash编码

为了能高效比较经纬度,redis使用了geohash编码,原理就是二分区间,区间编码(先对经度和维度分别编码,然后再各自组合成一个最终编码)
对于一个地理位置,经度范围为[-180,180],该编码会对该范围做N次(N可自定义)的二分区间,最终形成一个二进制值:

  • 第一次二分区:经度被划分[-180,0)和(0,180]两个左右半区,如果地址在左半区就用0表示,反之则1表示,这样就得到一位编码值
  • 同理重复上面操作N次,就得到一个长度为Nbit的二进制值
  • 维度编码也是如此
  • 最终组合在一起,组合规则是:偶数上(0开始)依次是经度的编码值,奇数(1开始)是纬度编码值


    image.png

那么一块区域的二进制编码值不就完成了(zset就可以保存了)
那么查询附件位置的车辆信息就变成了“查询二进制值(权重)等于该区域的车辆”问题了
在线体验geo

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容