5-Redis特殊数据类型GeoSpatical+Hyperloglog+.Bitmaps
GeoSpatical
城市经度纬度查询
定位朋友 附近的人 打车距离计算
半径之内的人 附近的人城市距离远近等等
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) 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