geospatial地理位置
朋友的定位,附近的人,打车距离计算
Redis的Geo在Redis3.2版本推出,这个功能可以推算出地理位置信息,,两地之间的距离,方圆几里的人
可以查询一些测试数据
相关命令
- GEOADD
- GEODIST
- GEOHASH
- GEOPOS
- GEORADIUS
- GEORADIUSBYMEMBER
//geoadd添加地理位置
//规则:两极无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入
//参数 key 值(经度、纬度、名称)
127.0.0.1:6379> geoadd china:city 116.512885 39.847469 beijin
(integer) 1
127.0.0.1:6379> geoadd china:city 104.325723 30.862592 chengdu 116.332334 39.882806 shanghai
(integer) 2
127.0.0.1:6379> geoadd china:city 108.96 34.26 xian
(integer) 1
127.0.0.1:6379>
//GEOPOS
//获取指定城市的经度和纬度
127.0.0.1:6379> geopos china:city chengdu
1) 1) "104.32572394609451"
2) "30.862591207711652"
//GEODIST
//geodist key member1 member2 [unit] 单位
127.0.0.1:6379> geodist china:city beijin shanghai
//GEORADIUS
//经度 纬度 半径,以该经度纬度为中心寻找半径中的成员有哪些
127.0.0.1:6379> georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC
//GEORADIUSBYMEMBER
//以某成员为中心寻找半径中的成员
127.0.0.1:6379> GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES
//GEOHASH
//将二维的经纬度转换为一维的字符串
127.0.0.1:6379> GEOHASH key member [member ...]
GEO底层的实现原理其实就是Zset
//查看其中的元素
127.0.0.1:6379> zrange china:city 0 -1
1) "chengdu"
2) "xian"
3) "beijin"
4) "shanghai"
//移除元素
127.0.0.1:6379> zrem key member [member ...]
Hyperloglog
基数:一个集合中不重复的元素
Redis Hyperloglog基数统计算法
优点:占用的内存是固定的,2^64不同的元素的技术,只需要废12KB的内存!如果要从内存角度来比较的话Hyperloglog首选!
网页的UV(一个人访问一个网站多次,但是还是算作一个人)
传统的方式,set 保存用户的id ,然后就可以统计set中的元素数量作为标准判断!
这个方式如果保存大量的用户id ,就会比较麻烦!我们的目的是为了计数,而不是保存用户id ;
0.81%错误率!统计UV任务,可以做一些经度要求不那么高的任务
127.0.0.1:6379> pfadd mykey a b c d e f g g g
(integer) 1
127.0.0.1:6379> pfcount mykey
(integer) 7
//合并(不重复)
127.0.0.1:6379> pfmerge destkey sourcekey [sourcekey ...]
如果允许容错,那么一定可以使用Hyperloglog
如果不允许容错,那就使用set或者自己的数据类型即可
Bitmaps
位存储
统计用户信息,活跃,不活跃,打卡,两个状态的,都可以使用Bitmaps
Bitmaps位图,数据结构!都是操作二进制位来进行记录,就只有0和1两个状态
//设置值
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 1
(integer) 0
//获取值
127.0.0.1:6379> getbit sign 2
(integer) 1
//统计操作
127.0.0.1:6379> bitcount key [start end]