一、Geospatial 地理位置 朋友的定位,附近的人,打车距离计算? Redis 的 Geo 在Redis3.2 版本就推出了! 这个功能可以推算地理位置的信息,两地之间的距离,方圆 几里的人! 可以查询一些测试数据:http://www.jsons.cn/lngcodeinfo/0706D99C19A781A3/ 只有六个命令 官方文档:https://www.redis.net.cn/order/3685.html
1.1、getadd 添加地理位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 (error) ERR invalid longitude,latitude pair 39.900000,116.400000 127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing (integer ) 1 127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai (integer ) 1 127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqi 114.05 22.52 shengzhen (integer ) 2 127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian (integer ) 2
1.2、getpos 获得当前定位:一定是一个坐标值!
1 2 3 4 5 6 7 8 127.0.0.1:6379> GEOPOS china:city beijing 1) 1) "116.39999896287918091" 2) "39.90000009167092543" 127.0.0.1:6379> GEOPOS china:city beijing chongqi 1) 1) "116.39999896287918091" 2) "39.90000009167092543" 2) 1) "106.49999767541885376" 2) "29.52999957900659211"
1.3、GEODIST 两人之间的距离! 单位:
m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。1 2 3 4 127.0.0.1:6379> GEODIST china:city beijing shanghai km "1067.3788" 127.0.0.1:6379> GEODIST china:city beijing chongqi km "1464.0708"
1.4、georadius 以给定的经纬度为中心, 找出某一半径内的元素 我附近的人? (获得所有附近的人的地址,定位!)通过半径来查询! 获得指定数量的人,200 所有数据应该都录入:china:city ,才会让结果更加请求!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km 1) "chongqi" 2) "xian" 3) "shengzhen" 4) "hangzhou" 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km 1) "chongqi" 2) "xian" 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist 1) 1) "chongqi" 2) "341.9374" 2) 1) "xian" 2) "483.8340" 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord 1) 1) "chongqi" 2) 1) "106.49999767541885376" 2) "29.52999957900659211" 2) 1) "xian" 2) 1) "108.96000176668167114" 2) "34.25999964418929977" 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 1 1) 1) "chongqi" 2) "341.9374" 3) 1) "106.49999767541885376" 2) "29.52999957900659211" 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2 1) 1) "chongqi" 2) "341.9374" 3) 1) "106.49999767541885376" 2) "29.52999957900659211" 2) 1) "xian" 2) "483.8340" 3) 1) "108.96000176668167114" 2) "34.25999964418929977"
1.5、GEORADIUSBYMEMBER 1 2 3 4 5 6 7 127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km 1) "beijing" 2) "xian" 127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km 1) "hangzhou" 2) "shanghai"
1.6、GEOHASH 返回一个或多个位置元素的 Geohash 表示 该命令将返回11个字符的Geohash字符串!
1 2 3 4 127.0.0.1:6379> geohash china:city beijing chongqi 1) "wx4fbxxfke0" 2) "wm5xzrybty0"
GEO 底层的实现原理其实就是 Zset!我们可以使用Zset命令来操作geo!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 127.0.0.1:6379> ZRANGE china:city 0 -1 1) "chongqi" 2) "xian" 3) "shengzhen" 4) "hangzhou" 5) "shanghai" 6) "beijing" 127.0.0.1:6379> zrem china:city beijing (integer ) 1 127.0.0.1:6379> ZRANGE china:city 0 -1 1) "chongqi" 2) "xian" 3) "shengzhen" 4) "hangzhou" 5) "shanghai"
二、Hyperloglog 2.1、什么是基数? A {1,3,5,7,8,7} B{13,5,7,8} 基数(不重复的元素) = 5,可以接受误差!
2.2、简介 Redis 2.8.9 版本就更新了 Hyperloglog 数据结构! Redis Hyperloglog 基数统计的算法! 优点:占用的内存是固定,2^64 不同的元素的技术,只需要废 12KB内存!如果要从内存角度来比较的 话 Hyperloglog 首选!网页的 UV (一个人访问一个网站多次,但是还是算作一个人!) 传统的方式, set 保存用户的id,然后就可以统计 set 中的元素数量作为标准判断 ! 这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id; 0.81% 错误率! 统计UV任务,可以忽略不计的!
2.3、测试使用 1 2 3 4 5 6 7 8 9 10 11 12 127.0.0.1:6379> PFadd mykey a b c d e f g h i j (integer ) 1 127.0.0.1:6379> PFCOUNT mykey (integer ) 10 127.0.0.1:6379> PFadd mykey2 i j z x c v b n m (integer ) 1 127.0.0.1:6379> PFCOUNT mykey2 (integer ) 9 127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 OK 127.0.0.1:6379> PFCOUNT mykey3 (integer ) 15
如果允许容错,那么一定可以使用 Hyperloglog ! 如果不允许容错,就使用 set 或者自己的数据类型即可!
三、Bitmap 3.1、位存储 统计用户信息,活跃,不活跃! 登录 、 未登录! 打卡,365打卡! 两个状态的,都可以使用 Bitmaps! Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有0 和 1 两个状态! 365 天 = 365 bit 1字节 = 8bit 46 个字节左右!
3.2、测试 使用bitmap 来记录 周一到周日的打卡! 周一:1 周二:0 周三:0 周四:1 …… 查看某一天是否有打卡!
1 2 3 4 127.0.0.1:6379> getbit sign 3 (integer ) 1 127.0.0.1:6379> getbit sign 6 (integer ) 0
统计操作,统计打卡的天数!
1 2 127.0.0.1:6379> bitcount sign (integer ) 3