Geospatial
可以推算地理位置信息,方圆几里的人
geoadd 添加地理信息
1
2
3
4
5
6
7
8
9
10
11
| # 添加地理位置
# 规则:两极无法直接添加,一般会下载城市数据,直接通过java程序一次性导入。
# 参数 key 值(经度、纬度、名称)
# 有效经度从-180度到180度
# 有效纬度从-85.05112878度到85.05112878度
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 chongqing 114.05 22.52 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 4
|
geopos从key里返回所有给定位置元素的位置(经度和纬度)
1
2
3
4
5
6
7
8
9
10
11
| 127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city chongqing
1) 1) "106.49999767541885376"
2) "29.52999957900659211"
127.0.0.1:6379> geopos china:city shengzhen hangzhou
1) 1) "114.04999762773513794"
2) "22.5200000879503861"
2) 1) "120.1600000262260437"
2) "30.2400003229490224"
|
deodist返回两个给顶顶位置之间的距离
单位:
m表示单位为米
km表示单位为千米
mi表示单位为英里
ft表示单位为英尺
1
2
3
4
5
| # 直线距离
127.0.0.1:6379> geodist china:city shanghai beijing
"1067378.7564"
127.0.0.1:6379> geodist china:city shanghai beijing km
"1067.3788"
|
georadius以给定的经纬度为中心,找出某一半径内的元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist # 显示距离
1) 1) "chongqing"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord # 显示经纬度
1) 1) "chongqing"
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 count 1 # 显示指定数量
1) "chongqing"
|
georadiusbymember找出位于指定范围内的元素,中心点是由给定的位置元素决定
1
2
3
4
5
| 127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city xian 400 km
1) "xian"
|
geohash返回一个或者多个位置元素的geohash值
该命令将返回11个字符的geohash字符串
1
2
3
4
| # 将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么距离越接近
127.0.0.1:6379> GEOHASH china:city shanghai beijing
1) "wtw3sj5zbj0"
2) "wx4fbxxfke0"
|
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) "chongqing"
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) "chongqing"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "shanghai"
|
Hyperloglog
什么是基数?
A{1, 3, 5, 7, 8, 7}
B{1, 3, 5, 7, 8}
基数(不重复的元素)=5,可以接受误差
简介(布隆过滤器)
Redis Hyperloglog基数统计的算法
优点:占用的内存数固定的,2^64不同的元素的技术,只需耗费12KB内存,如果从内存角度来比较的话Hyperloglog首选。
但是有0.81%的错误率。
网页的UV(一个人访问一个网站多次,但还是算作一个人)
传统的方式:色图保存用户的id,然后就可以统计set中的元素数量作为标准判读!
这个方式如果保存大量的用户id,就会比较麻烦。但目的是为了计数,而不是保存用户id,因此会浪费大量内存。
使用Hyperloglog可以忽略其错误率。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| 127.0.0.1:6379> pfadd mykey a b c d e f g h i j # 创建第一组元素mykey
(integer) 1
127.0.0.1:6379> pfcount mykey # 统计mykey元素的基数数量(非重复)
(integer) 10
127.0.0.1:6379> pfadd mykey a
(integer) 0
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 # 合并多组到mykey3
OK
127.0.0.1:6379> pfcount mykey3
(integer) 15
127.0.0.1:6379> pfcount mykey
(integer) 10
|
如果允许容错,那么一定可以使用Hyperloglog。
如果不允许出错,就是用set或者自己的数据类型即可。
Bitmap
位存储(0或1)
统计用户信息:活跃,不活跃;登录,未登录;打卡,未打卡。
两个状态的都可以使用Bitmap
Bitmaps位图,数据结构,都是操作二进制位来进行记录,只有0和1两个状态。
测试
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
| # 使用bitmap来记录周一到周日的打卡
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 0
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
# 查看某一天是否有打卡
127.0.0.1:6379> getbit sign 3
(integer) 0
127.0.0.1:6379> getbit sign 6
(integer) 0
127.0.0.1:6379> getbit sign 0
(integer) 1
# 统计操作,统计打卡的天数
127.0.0.1:6379> bitcount sign 0 3
(integer) 3
|