DB 读:从 cache 中读取数据,读取到直接返回,否则查 DB 后写入到 cache,之后返回数据 双写一致性解决方案 以上三种经典的读写策略在一定条件下都会产生缓存和数据库数据不一致的问题,这里给出两种解决方案...计算两个位置之间的距离: 在某个集合中获取其中两个位置的直线距离:GEODIST location-set location-x location-y [unit] 其中 unit 可选参数为 m |...,添加则在返回匹配的位置时会将该位置的经纬度一并返回 WITHDIST:可选参数,添加则在返回匹配的位置时会将该位置与中心点之间的距离一并返回 ASC|DESC:可选参数,添加 ASC 将返回的匹配位置根据距离从近到远排序...112.927076 28.235653 (长沙) 500km 以内的位置信息,查找结果中应包含不超过 5 个位置的坐标信息,距离信息,并按距离由近到远排序:GEORADIUS hubeiCities...hubeiCities 中存在的位置,而不能指定位置坐标),查找结果中应包含不超过 2 个位置的坐标信息,距离信息,并按距离由远到近排序:GEORADIUSBYMEMBER hubeiCities wuhan
可以按给出的分类进行记忆,不一一罗列。 引擎 介绍 MySQL 中主要的存储引擎。...Hash 是使用散列表来对数据进行索引,Hash 方式不像 B-Tree 那样需要多次查询才能定位到记录,因此 Hash 索引的效率高于 B-Tree,但是不支持范围查找和排序等功能。...一个纬度是针对数据库设计、表结构设计以及索引设置纬度进行的优化; 第二个纬度是对我们业务中使用的 SQL 语句进行优化,例如调整 where 查询条件; 第三个纬度是对 MySQL 服务的配置进行优化...,例如对链接数的管理,对索引缓存、查询缓存、排序缓存等各种缓存大小进行优化; 第四个纬度是对硬件设备和操作系统设置进行优化,例如调整操作系统参数、禁用 swap、增加内存、升级固态硬盘等等。...对于研发人员来说,前两个纬度与业务息息相关,因此需要重点掌握,后两个纬度更适合 DBA 进行深入学习,简单了解就好。 那么,重点来看前两个纬度,要点如下图所示。
“附近的人” 核心思想如下: ① 以“自己”为中心,搜索附近的用户 ② 以“自己”当前的地理位置为准,计算出别人和 “我” 之间的距离 ③ 按“自己”与别人距离的远近排序,筛选出离我最近的用户或者商店等...(不推荐使用了) 基于mysql + GeoHash实现附近人查询 ① 设计思路 在原本存储用户经纬度的表中:入库时计算经纬度对应的geohash字符串存储到表中;那么存储时需要我们明确字符串的长度。...获取指定key里返回所有指定名称的位置(经度和纬度);时间复杂度O(log(n)),n是排序集中的元素数 注意事项: ① geopos命令返回的是一个数组,每个数组中的都由两个元素组成:第一个是位置的经度...② [m|km|ft|mi]尾部参数: m :米,默认单位 km :千米 mi :英里 ft :英尺 ③ 计算出的距离会以双精度浮点数的形式被返回;位置不存在,则返回...④ withcoord: 将位置元素的经度和维度也一并返回。 ⑤ withhash: 以 52 位有符号整数的形式,返回位置元素经过原始geohash编码的有序集合分值。
“附近的人” 核心思想如下: 以 “我” 为中心,搜索附近的用户 以 “我” 当前的地理位置为准,计算出别人和 “我” 之间的距离 按 “我” 与别人距离的远近排序,筛选出离我最近的用户或者商店等 [在这里插入图片描述...GEOADD:将给定的位置对象(纬度、经度、名字)添加到指定的key; GEOPOS:从key里面返回所有给定位置对象的位置(经度和纬度); GEODIST:返回两个给定位置之间的距离; GEOHASH...:返回一个或多个位置对象的Geohash表示; GEORADIUS:以给定的经纬度为中心,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象; GEORADIUSBYMEMBER:以给定的位置对象为中心...WITHDIST:在返回位置对象的同时,将位置对象与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。 WITHCOORD:将位置对象的经度和维度也一并返回。...WITHHASH:以 52 位有符号整数的形式,返回位置对象经过原始 geohash 编码的有序集合分值。这个选项主要用于底层应用或者调试,实际中的作用并不大。
“附近的人” 核心思想如下: 以 “我” 为中心,搜索附近的用户 以 “我” 当前的地理位置为准,计算出别人和 “我” 之间的距离 按 “我” 与别人距离的远近排序,筛选出离我最近的用户或者商店等 二、...GEOADD:将给定的位置对象(纬度、经度、名字)添加到指定的key; GEOPOS:从key里面返回所有给定位置对象的位置(经度和纬度); GEODIST:返回两个给定位置之间的距离; GEOHASH...:返回一个或多个位置对象的Geohash表示; GEORADIUS:以给定的经纬度为中心,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象; GEORADIUSBYMEMBER:以给定的位置对象为中心...WITHDIST:在返回位置对象的同时,将位置对象与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。 WITHCOORD:将位置对象的经度和维度也一并返回。...WITHHASH:以 52 位有符号整数的形式,返回位置对象经过原始 geohash 编码的有序集合分值。这个选项主要用于底层应用或者调试,实际中的作用并不大。
用关系型数据库(mysql)的方式解决问题 我们先把问题简化,假如我附近的人都是不动的,也就是说他们的位置是固定的,按照咱们传统的思路,就是把每个人的经纬度存起来,然后遍历这些经纬度,我们可以通过某种方法获取我和各个经纬度之间的距离...遍历数据,和自己对比,获得每个人和自己的距离 把数据库的所有记录都遍历一遍,把每一条记录的经纬度和自己的经纬度做个对比,就能获取到各个记录离自己的距离。...用关系型数据库(mysql)存在的问题 其实用 mysql 的方式表面上看着是可以解决问题的,其实不然 首先遍历数据就是遍历所有的数据,而且是在一个需要及时返回结果的接口中,这样做是非常不科学的,用户量非常多的话根本不现实...WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 WITHCOORD: 将位置元素的经度和维度也一并返回。...WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。这个选项主要用于底层应用或者调试, 实际中的作用并不大。 COUNT 限定返回的记录数。
要做这个附近的人,首先要收集用户的经纬度存放到数据库,也就是我们的数据表会变成这样 参数名 说明 id 自增主建 user_id 用户ID live_url 播放地址 obs_url 推流地址 avatar...常见附近的人处理方式有: Mysql实现附近的人 mysql 实现附近的人也分2种方案 每次都通过函数计算 这种就需要计算,消耗大一点,但是数据量小直径忽略,业务最大,开发效率最大 这里给出一点代码,...的空间函数 ST_Distance_Sphere 进行计算得出距离, 以米为单位 利用GeoHash 减少计算 GeoHash算法将二维的经纬度数据映射到一维的整数,这样所有的元素都将挂载到一条线上,...我们使用对经纬度进行 geohash 算法计算得出hash值, 存入数据库使用like查询, 查出附近的人进行二次计算得出距离即可 Redis Redis中处理这些地理位置坐标点的思想是: Redis中经纬度使用..., 例如: 礼物表、礼物类别、直播间礼物打赏日志、其他用户消费日志等等 这里我说一下礼物表, 基本字段 参数名 说明 id 自增主建 title 礼物名称 image 礼物图片 svga SVGA的URL
geopos 从key里返回所有给定位置元素的位置(经度和纬度) geodist 返回两个给定位置之间的距离 georadius 以给定的经纬度为中心, 找出某一半径内的元素 georadiusbymember...:计算出的距离会以双精度浮点数的形式被返回。...如果给定的位置元素不存在, 那么命令返回空值。 georadius 命令 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。...WITHCOORD: 将位置元素的经度和维度也一并返回。 WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。...这个选项主要用于底层应用或者调试, 实际中的作用并不大。 命令默认返回未排序的位置元素。
ln(x) 返回自然对数。 log2(x) 返回以2为底,x的对数。 log10(x) 返回以10为底,x的对数。 log(x,b) 返回以b为底,x的对数。 pi() 返回π。...select geohash('34.1,120.6')= 'wwjcbrdnzs' geohash(lat,lon) 将纬度、经度用geohash编码,参数分别是纬度和经度。...: 排名问题:每个部门按业绩来排名 topN问题:找出每个部门排名前N的员工进行奖励 面对这类需求,就需要使用sql的高级功能窗口函数了。...以上样例等同于SELECT 3 6; 如果三个参数中任何一个包含Null,则返回的结果为Null。...IS NULL 和 IS NOT NULL 用于判断参数是否为NULL值 GREATEST 和 LEAST 用于获取多列中的最大值或者最小值 select greatest(1,3,4) -- 返回的是
,而不是逐行删除表中的数据 创建数据表 为利用CREATE TABLE创建表,必须给出下列信息: 新表的名字,在关键字CREATE TABLE之后给出 表列的名字和定义,用逗号分隔。...视图可返回与底层表的表示和格式不同的数据 视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的。...MySQL支持IN(传递给存储过程)、OUT(从存储过程传出,如这里所用)和INOUT(对存储过程传入和传出)类型的参数并通过指定INTO关键字来将处理结果保存在对应的变量中 为调用上述存储过程,使用下面方法...注:MYSQL5以后,不允许触发器返回任何结果,因此使用into @变量名,将结果赋值到变量中,用select调用即可 触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。...事务处理块中可以使用这两条语句,但如果你执行回退,它们不会被撤销。 一般的MySQL语句都是直接针对数据库表执行和编写的。
附近的人核心思想如下: 以 “我” 为中心,搜索附近的 Ta; 以 “我” 当前的地理位置为准,计算出别人和 “我” 之间的距离; 按 “我” 与别人距离的远近排序,筛选出离我最近的用户。...MySQL 实现 “计算「附近的人」,通过一个坐标计算这个坐标附近的其他数据,按照距离排序,如何下手呢?...为了满足高性能的矩形区域算法,数据表需要在经纬度坐标加上复合索引 (longitude, latitude),这样可以最大优化查询性能。...” Hash看起来好像可以实现,但是 LBS 应用除了记录经纬度以外,还需要对 Hash 集合中的数据进行范围查询,根据经纬度换算成距离排序。 而 Hash 集合的数据是无序的,显然不可取。...km ASC COUNT 10 ASC可以实现让「女神」信息按照这个距离自己的经纬度由近到远排序。
附近的人核心思想如下: 以 “我” 为中心,搜索附近的 Ta; 以 “我” 当前的地理位置为准,计算出别人和 “我” 之间的距离; 按 “我” 与别人距离的远近排序,筛选出离我最近的用户。...MySQL 实现 “计算「附近的人」,通过一个坐标计算这个坐标附近的其他数据,按照距离排序,如何下手呢?...” 以用户为中心,给定一个 1000 米作为半径画圆,那么圆形区域内的用户就是我们想要邂逅的「附近的人」。 将经纬度存储到 MySQL: ?...“可是总不能遍历所有的「女神」经纬度与自己的经纬度数据计算在根据距离排序,这个计算量也太大了。...Hash看起来好像可以实现,但是 LBS 应用除了记录经纬度以外,还需要对 Hash 集合中的数据进行范围查询,根据经纬度换算成距离排序。 而 Hash 集合的数据是无序的,显然不可取。
附近的人核心思想如下: 以 “我” 为中心,搜索附近的 Ta; 以 “我” 当前的地理位置为准,计算出别人和 “我” 之间的距离; 按 “我” 与别人距离的远近排序,筛选出离我最近的用户。...MySQL 实现 “计算「附近的人」,通过一个坐标计算这个坐标附近的其他数据,按照距离排序,如何下手呢?...为了满足高性能的矩形区域算法,数据表需要在经纬度坐标加上复合索引 (longitude, latitude),这样可以最大优化查询性能。...Hash看起来好像可以实现,但是 LBS 应用除了记录经纬度以外,还需要对 Hash 集合中的数据进行范围查询,根据经纬度换算成距离排序。 而 Hash 集合的数据是无序的,显然不可取。...km ASC COUNT 10 ASC可以实现让「女神」信息按照这个距离自己的经纬度由近到远排序。
字符串越长,表示的范围越精确。 ? GEOPOS 从key里返回所有给定位置元素的位置(经度和纬度)。...距离的单位和用户给定的范围单位保持一致 WITHCOORD: 将位置元素的经度和维度也一并返回 WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值...这个选项主要用于底层应用或者调试, 实际中的作用并不大。 命令默认返回未排序的位置元素。...通过以下两个参数, 用户可以指定被返回位置元素的排序方式: ASC 根据中心的位置, 按照从近到远的方式返回位置元素。 DESC 根据中心的位置, 按照从远到近的方式返回位置元素。...工作原理 sorted set 使用一种称为 Geohash 的技术进行填充。经度和纬度的位是交错的,以形成一个独特的 52 位整数.
GEO相关的命令如下: Redis 命令 描述 GEOHASH 返回一个或多个位置元素的 Geohash 表示 GEOPOS 从 key 里返回所有给定位置元素的位置(经度和纬度) GEODIST 返回两个给定位置之间的距离...WITHCOORD 将位置元素的经度和维度也一并返回,非必选。 WITHDIST 在返回位置元素的同时, 将位置元素与中心点的距离也一并返回。距离的单位和查询单位一致,非必选。...比如返回前 10 个,以避免出现符合的结果太多而出现性能问题。 ASC|DESC 排序方式,非必选。默认情况下返回未排序,但是大多数我们需要进行排序。...例如,我们在 cities:locs 中查找以(115.03,38.44)为中心,方圆200km的城市,结果包含城市名称、对应的坐标和距离中心点的距离(km),并按照从近到远排列。...,参见章节 2.2中的WITHCOORD、COUNT、ASC等,例如我们需要在返回结果中包含坐标、中心距离、由近到远排序的前 5 条数据: RedisGeoCommands.GeoRadiusCommandArgs
: 返回两个给定位置之间的距离; GEOHASH: 返回一个或多个位置对象的Geohash表示; GEORADIUS: 以给定的经纬度为中心,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象;...GEORADIUSBYMEMBER: 以给定的位置对象为中心,返回与其距离不超过给定最大距离的所有位置对象。...在Redis源码geo.c的文件注释中,只说明了该文件为GEOADD、GEORADIUS和GEORADIUSBYMEMBER的实现文件(其实在也实现了另三个命令)。从侧面看出其他三个命令为辅助命令。...,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象。...WITHHASH:以 52 位有符号整数的形式,返回位置对象经过原始 geohash 编码的有序集合分值。这个选项主要用于底层应用或者调试,实际中的作用并不大。
GEO相关的命令如下: Redis 命令 描述 GEOHASH 返回一个或多个位置元素的 Geohash 表示 GEOPOS 从 key 里返回所有给定位置元素的位置(经度和纬度) GEODIST 返回两个给定位置之间的距离...WITHCOORD 将位置元素的经度和维度也一并返回,非必选。 WITHDIST 在返回位置元素的同时, 将位置元素与中心点的距离也一并返回。 距离的单位和查询单位一致,非必选。...比如返回前 10 个,以避免出现符合的结果太多而出现性能问题。 ASC|DESC 排序方式,非必选。默认情况下返回未排序,但是大多数我们需要进行排序。...例如,我们在 cities:locs 中查找以(115.03,38.44)为中心,方圆200km的城市,结果包含城市名称、对应的坐标和距离中心点的距离(km),并按照从近到远排列。...,参见章节 2.2中的WITHCOORD、COUNT、ASC等,例如我们需要在返回结果中包含坐标、中心距离、由近到远排序的前 5 条数据: RedisGeoCommands.GeoRadiusCommandArgs
这就要用到GEO类型中的GeoHash编码。 工作原理 sorted set 使用一种称为 Geohash 的技术进行填充。经度和纬度的位是交错的,以形成一个独特的 52 位整数....距离的单位和用户给定的范围单位保持一致 WITHCOORD: 将位置元素的经度和维度也一并返回 WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值...这个选项主要用于底层应用或者调试, 实际中的作用并不大。 命令默认返回未排序的位置元素。...通过以下两个参数, 用户可以指定被返回位置元素的排序方式: ASC 根据中心的位置, 按照从近到远的方式返回位置元素。 DESC 根据中心的位置, 按照从远到近的方式返回位置元素。...5 km ASC COUNT 10 进一步限定返回的车辆信息: ASC,让返回的车辆信息按距离中心位置从近到远排序,以方便选择最近车辆 COUNT,指定返回的车辆信息的数量 可能5公里范围内车辆很多
前言:针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。...假设地图上会显示以自己为圆心,5公里为半径,这个范围内的车。如何实现呢?最直观的想法就是去数据库里面查表,计算并查询车距离用户小于等于5公里的,筛选出来,把数据返回给客户端。...这样即使每一块里面的每条数据都计算一次相对距离,也比之前全表都计算一次要快很多。 我们也都知道,现在用的比较多的数据库 MySQL、PostgreSQL 都原生支持 B+ 树。...同类问题: 我不知道mysql 查询那个记录,我怎么做加锁查询。索引是全部记录做排序 我不知道用户查询那个位置,我怎么对全部位置进行排序!地理位置本身有序的,我怎么存储起来呀。...(integer) 2 //02 geopos命令:从key里返回所有给定位置元素的位置(经度和纬度) 127.0.0.1:6379> geopos china:city beijing 1) 1)
领取专属 10元无门槛券
手把手带您无忧上云