5-Redis特殊数据类型GeoSpatical+Hyperloglog+.Bitmaps

GeoSpatical

城市经度纬度查询

定位朋友 附近的人 打车距离计算

半径之内的人 附近的人城市距离远近等等

https://redis.io/commands/geoadd/

image-20220416070204133

添加信息查询信息

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) 15

Bitmaps

位存储 占用空间最小

适用于非黑即白的两种状态的场景 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

posted @ 2022-04-19 09:14  机猿巧合  阅读(30)  评论(0编辑  收藏  举报