前言:针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG.MySQL和MongoDB等多种DB的空间索引进行实现.而Redis另辟蹊径,结合其有序队列zset以及geohash编码,实现了空间搜索功能,且拥有极高的运行效率.   本文将从源码角度对其算法原理进行解析,并推算查询时间复杂度. 要提供完整的“附近的人”服务,最基本的是要实现“增”.“删”.“查”的功能.以下将分别进行介绍,其中会重点对查询功能进行解析. 操作命令 自Redis 3.2开始,Redis基于geohash和有序…
作者简介 万汨,饿了么资深开发工程师.iOS,Go,Java均有涉猎.目前主攻大数据开发.喜欢骑行.爬山. 前言:针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG.MySQL和MongoDB等多种DB的空间索引进行实现.而Redis另辟蹊径,结合其有序队列zset以及geohash编码,实现了空间搜索功能,且拥有极高的运行效率.本文将从源码角度对其算法原理进行解析,并推算查询时间复杂度. 要提供完整的“附近的人”服务,最基本的是要实现“增”.“删”.“查”的功能.以下将分别进行介绍,…
在前一篇文章中,我们已经介绍过Redis的一些实际应用.如KV缓存.分布式锁.消息队列,由于篇幅原因,并未介绍完全.接下来将继续为各位带来Redis的更多应用. bitmat(位图) 实现 位图的基本思想是使用一个bit来表示一个映射关系,这样就能大大减小内存的使用.如一个用户一周的签到情况可以用以下方式来实现. 如果不用位图,而用int 来实现的话,需要7个int的空间来存储,而使用位图后,一个int空间即可表示出用户一周的签到情况了. 常用指令 setbit:设置位图值: 127.0.0.1…
Redis是个好东西,经过上两个星期的研究和实践,目前正在项目里大规模的替换掉原来的本地内存cache.但是替换过程中却发现,Redis这东西高端,大气上档次,似乎不是我想象里的使用方法. 在没有深入Redis之前,在我的概念里,缓存,就是key-value.而使用方式肯定不需要改动多少代码,一切都是Get/Set.但是实际用的时候却发现,我错了,不是所有的场景都是简单的Get/Set.也不是所有的数据都适合key-Value,于是有了这个问题,Redis到底该如何使用?我问自己,也向园子里的朋…
Redis是个好东西,经过上两个星期的研究和实践,目前正在项目里大规模的替换掉原来的本地内存cache.但是替换过程中却发现,Redis这东西高端,大气上档次,似乎不是我想象里的使用方法. 在没有深入Redis之前,在我的概念里,缓存,就是key-value.而使用方式肯定不需要改动多少代码,一 切都是Get/Set.但是实际用的时候却发现,我错了,不是所有的场景都是简单的Get/Set.也不是所有的数据都适合key-Value,于是有了 这个问题,Redis到底该如何使用?我问自己,也向园子里…
在之前的一篇文章<SpringBoot入门教程(五)Java基于MySQL实现附近的人>,我们介绍了Java基于MySQL实现查找附近的人的功能.今天就来研究研究"查找附近的人"的另一个方案,一个基于Redis的方案. vGEO地理位置 可用版本: >= 3.2.0 地理位置大概提供了6个命令,分别为: GEOADD GEODIST GEOHASH GEOPOS GEORADIUS GEORADIUSBYMEMBER vGEOADD 1.1 GEOADD概念 将给定的…
1. 要实现" 附近的人" 这功能,然后就研究了下: (1)首先要做的就是要获取到自己当前位置的经纬度(编程获取手机GPS定位模块的信息,进而获取自己当前位置的经纬度) (2)然后就是上传自己的数据给服务器 (3)服务器经过计算然后把符合项目定义的最大距离的附近的人的数据传到前台 (4)前台通过数据来展示 其中最主要的其实就是经纬度的距离的计算: 源码下载地址: https://github.com/feicien/studydemo手机端项目:NearByDemo服务器端项目:Nea…
最近在Java技术栈公众号发布的一篇文章,其中有一道题: Redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看) 好些粉丝在后台问我:为什么请回,Redis不是单线程吗? 大家注意审题:Redis是多线程还是单线程? 这个问题你要从多个方面回答,如果你仅仅只回答 "单线程" 肯定是说不过去的,为什么呢? 所以今天,栈长利用工作时间紧急把这个问题紧急梳理了下,希望对大家有帮助. 1.Redis 单线程到底指什么? 没错,大家所熟知的 Redis 确实是单线程模型,指的…
转自:http://blog.csdn.net/kaosini/article/details/9176961 一.对Redis持久化的探讨与理解    redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.redis支持两种持久化方式,一种是 Snapshot(RDB)也是默认方式,另一种是Append only file(AOF)的方式.具体的理论说明请见这里.    我们应该明确持久化的数据有什么用,答案是用于重启后的数据恢复.Redis是…
前言 Redis是一种基于键值对(Key-Value)的NoSQL数据库,Redis的Value可以由String,hash,list,set,zset,Bitmaps,HyperLogLog等多种数据结构和算法组成.Redis还提供了键过期,发布订阅,事务,Lua脚本,哨兵,Cluster等功能.Redis执行命令的速度非常快,根据官方给的性能可以达到10w+qps.那么本文主要介绍到底Redis快在哪里,主要有以下几点: 一.开发语言 现在我们都用高级语言来编程,比如Java.python等…