城市经度纬度查询
定位朋友 附近的人 打车距离计算
半径之内的人 附近的人城市距离远近等等
https://redis.io/commands/geoadd/
添加信息查询信息127.0.0.1:6379> GEOADD china:city 116.41667 39.91667 beijing #添加城市信息 经度维度 (integer) 1 127.0.0.1:6379> GEOADD china:city 121.43333 31.23000 shanghai (integer) 1 127.0.0.1:6379> GEOADD china:city 106.45000 29.56667 chongqing (integer) 1 127.0.0.1:6379> GEOADD china:city 114.06667 22.61667 shenzhen (integer) 1 127.0.0.1:6379> GEOADD china:city 120.20000 30.26667 hangzhou (integer) 1 127.0.0.1:6379> GEOADD china:city 108.95000 34.26667 xian (integer) 1 127.0.0.1:6379> GEOPOS china:city beijing #查询一个城市的经纬度 1) 1) "116.41667157411575317" 2) "39.91667095273589183" 127.0.0.1:6379> GEOPOS china:city beijing xian #一次查询多个城市的经纬度 1) 1) "116.41667157411575317" 2) "39.91667095273589183" 2) 1) "108.95000249147415161" 2) "34.2666710302806834"查询城市之间的直线距离
127.0.0.1:6379> GEODIST china:city beijing shanghai #查询beijing shanghai距离 "1066981.1340" 127.0.0.1:6379> GEODIST china:city beijing shanghai km # 以km为单位查询 "1066.9811" 127.0.0.1:6379> GEODIST china:city beijing chongqing km "1465.8918"指定坐标周围的人
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km #查询指定坐标 1000km的城市
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km # 500km周围的城市
1) "chongqing"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist # 查询周围城市+直线距离
1) 1) "chongqing"
2) "346.0548"
2) 1) "xian"
2) "484.7511"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord #查询周围城市+经纬度
1) 1) "chongqing"
2) 1) "106.4500012993812561"
2) "29.56666939001875249"
2) 1) "xian"
2) 1) "108.95000249147415161"
2) "34.2666710302806834"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoo
rd count 1 #查询指定定位指定直线距离的城市 并带上直线距离和经纬度 查找一个城市
1) 1) "chongqing"
2) "346.0548"
3) 1) "106.4500012993812561"
2) "29.56666939001875249" #场景 周围的人 100人 就 count 100
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2 #2个人
1) 1) "chongqing"
2) "346.0548"
3) 1) "106.4500012993812561"
2) "29.56666939001875249"
2) 1) "xian"
2) "484.7511"
3) 1) "108.95000249147415161"
2) "34.2666710302806834"
根据城市周围定位
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km #beijing周围100km的城市 1) "beijing" 2) "xian" 127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 1000 km #shanghai周围 1000km的城市 1) "hangzhou" 2) "shanghai"经纬度转换成hash值
127.0.0.1:6379> GEOHASH china:city beijing chongqing 1) "wx4g14s53n0" 2) "wm78nq6w2f0"关于geo
redis底层就是五大基础数据类型 其它的类型本质上也是五大基本类型转变体
geo底层的基本数据类型是zset
127.0.0.1:6379> zrange china:city 0 -1 #可以通过zset查询所有城市 1) "chongqing" 2) "xian" 3) "shenzhen" 4) "hangzhou" 5) "shanghai" 6) "beijing" 127.0.0.1:6379> zrem china:city beijing #geo没有删除功能 可以通过zrem 删除某个城市 (integer) 1 127.0.0.1:6379> zrange china:city 0 -1 # 删除成功 1) "chongqing" 2) "xian" 3) "shenzhen" 4) "hangzhou" 5) "shanghai"Hyperloglog
基数统计的算法
基数 集合内不重复的数的统计
a{a,b,c,c,d}
b{d,e,f,g}
abd的基数={a,b,c,d,e,f,g}=7
应用场景
网站访问量uv (一个人的多次不重复动作要被统计为一个人)
传统方式set用户保存用户id 用户量大 占用大量内存来保存id 但是我们的目只是统计uv
内存浪费了
Hyperloglog的优点 占用内存小12kb内存 错误了0.81% 可以被允许
127.0.0.1:6379> PFADD mypf a b c d e f g h #创建一个集合a-h (integer) 1 127.0.0.1:6379> PFCOUNT mypf #查询统计数量为8 (integer) 8 127.0.0.1:6379> PFADD mypf1 h i j k l m n u #创建另外一个集合h-u (integer) 1 127.0.0.1:6379> PFCOUNT mypf1 #拆线呢统计数量也是8 连个集合有一个重复元素h (integer) 8 127.0.0.1:6379> PFMERGE mypf2 mypf mypf1 #把上面连个元素放到mypf2 OK 127.0.0.1:6379> PFCOUNT mypf2 #查询新元素的个数 15 自动去重了 (integer) 15Bitmaps
位存储 占用空间最小
适用于非黑即白的两种状态的场景 0 1
判断、统计活跃、不活跃,登录、未登录这些非1即0的场景
打卡 没打卡 bitmaps使用起来 很省内存
以一年365天卡信息为例
365=365bit /8=64字节 一年的打卡记录信息只占用64字节
127.0.0.1:6379> flushdb OK 127.0.0.1:6379> 127.0.0.1:6379> SETBIT daka 0 1 (integer) 0 127.0.0.1:6379> SETBIT daka 1 1 (integer) 0 127.0.0.1:6379> SETBIT daka 2 1 (integer) 0 127.0.0.1:6379> SETBIT daka 3 1 (integer) 0 127.0.0.1:6379> SETBIT daka 4 1 (integer) 0 127.0.0.1:6379> SETBIT daka 5 1 (integer) 0 127.0.0.1:6379> SETBIT daka 6 0 (integer) 0 127.0.0.1:6379> SETBIT daka 7 0 #录入7天打开信息 (integer) 0 127.0.0.1:6379> GETBIT daka 4 #周四大卡了 (integer) 1 127.0.0.1:6379> GETBIT daka 6 #周六没打卡 (integer) 0 127.0.0.1:6379> BITCOUNT daka #一共打开6天 0-5 (integer) 6



