GEOADD添加一个地理位置
# GEOADD key [NX | XX] [CH] longitude latitude member [longitudelatitude member ...]
latitude member ...]
# GEOADD key 经度 纬度 名称 来添加地理位置 可以在这个网址搜索(https://jingweidu.bmcx.com/?_t=1557818155#google_vignette)
# 两极无法导入,一般下载城市数据直接通过java程序进行导入
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 chognqing
(integer) 1
127.0.0.1:6379> geoadd china:city 112.98 28.25 changsha 111.45 27.24 shaoyang
(integer) 2
127.0.0.1:6379> geoadd china:city 113.88 22.55 shenzhen 108.93 34.23 xian
(integer) 2
GEOPOS 获取指定城市坐标
# GEOPOS key [member [member ...]]
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 chognqing
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
GEODIST 返回给定两个位置直接的距离
# GEODIST key member1 member2 [M | KM | FT | MI]
# 单位必须是以下类型,默认是米
# 米、千米、英里、英尺
127.0.0.1:6379> GEODIST china:city beijing changsha
"1333235.2339"
127.0.0.1:6379> GEODIST china:city beijing changsha km
"1333.2352"
127.0.0.1:6379> GEODIST china:city changsha shaoyang
"187888.9301"
127.0.0.1:6379> GEODIST china:city changsha shaoyang km
"187.8889"
GEORADIUS返回geoadd填充了地理信息的排序集成员(6.2已过期,可用geosearch或者geosearchstore替代)
# GEORADIUS key longitude latitude radius
[WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC]
[STORE key | STOREDIST key]
# 以上海的经纬度为中心找出半径1000km以内的城市
127.0.0.1:6379> GEORADIUS china:city 120 30 1000 km
1) "changsha"
2) "shanghai"
3) "shaoyang"
# count-限制数量
# withcoord-显示经纬度
# withdist-显示距离
# store key-将返回的地理位置信息保存到一个key
# storedist key-将返回的离目标中心的距离保存到一个key
127.0.0.1:6379> GEORADIUS china:city 120 30 1000 km withcoord withdist count 2
1) 1) "shanghai"
2) "196.2512"
3) 1) "121.47000163793563843"
2) "31.22999903975783553"
2) 1) "changsha"
2) "709.1661"
3) 1) "112.9800000786781311"
2) "28.25000087963665152"
GEORADIUSBYMEMBER 通过geoadd填充的成员名字搜索(6.2已过期)
#GEORADIUSBYMEMBER key member radius [WITHCOORD]
[WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key
| STOREDIST key]
# 以邵阳为中心 1000km半径内的城市
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shaoyang 1000 km
1) "chognqing"
2) "shaoyang"
3) "xian"
4) "shenzhen"
5) "changsha"
GEOHASH 返回一个或多个位置元素的geohash表示(11个字符的字符串)
# GEOHASH key [member [member ...]]
# 将二维的经纬度转换为一维的字符串
127.0.0.1:6379> GEOHASH china:city changsha shenzhen
1) "wt02dyv80v0"
2) "ws0br3hgk20"
GEORADIUS_RO与GEORADIUS命令相同,除了不能添加store key 以及storedist key这两个参数
#GEORADIUS_RO key longitude latitude radius
[WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC]
GEOSEARCH扩展了GEORADIUS命令,因此除了在圆形区域内搜索外,它还支持在矩形区域内搜索(6.2以上版本)
GEOSEARCH key <FROMMEMBER member | FROMLONLAT longitude latitude>
<BYRADIUS radius <M | KM | FT | MI> | BYBOX width height <M | KM |
FT | MI>> [ASC | DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST]
[WITHHASH]
#BYRADIUS-半径搜索
#BYBOX-矩形搜索
GEO底层的数据结构是Zset,我们可以使用Zset的相关命令来进行操作
127.0.0.1:6379> ZRANGE china:city 0 -1 #查看地图中的全部元素
1) "chognqing"
2) "shaoyang"
3) "xian"
4) "shenzhen"
5) "changsha"
6) "shanghai"
7) "beijing"
127.0.0.1:6379> ZREM china:city beijing
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chognqing"
2) "shaoyang"
3) "xian"
4) "shenzhen"
5) "changsha"
6) "shanghai"
什么是基数
HyperLogLog是一个专门为了计算集合的基数而创建的概率算法,对于一个给定的集合,HyperLogLog可以计算出这个集合的近似基数:近似基数并非集合的实际基数,它可能会比实际的基数小一点或者大一点,但是估算基数和实际基数之间的误差会处于一个合理的范围之内。
比如:
A {a,b,y,d}
B {a,c,g}
这两个集合的基数(不重复的元素)=5,可以接受误差
优点:占用的内存是固定的,2^64的不同元素的基数只需要12kb的内存
使用案例:统计网页的UV(一个人访问一个网站多次,还是算作一个人)
按照我们传统的方式,使用set保存用户的id,然后统计set中的元素个数作为标准判断,如果存入大量的用户id就会比较麻烦,作为统计UV而言,HyperLogLog带来的误差是可以忽略不计的。
127.0.0.1:6379> PFADD mykey a b c d e f g #创建元素
(integer) 1
127.0.0.1:6379> pfcount mykey #统计元素
(integer) 7
127.0.0.1:6379> PFADD mykey1 f g h i j k
(integer) 1
127.0.0.1:6379> PFCOUNT mykey1
(integer) 6
127.0.0.1:6379> PFMERGE mykey3 mykey mykey1 #合并元素
OK
127.0.0.1:6379> PFCOUNT mykey3
(integer) 11
如果允许容错,一定可以使用HyperLogLog,如果不允许容错,就使用set。
统计用户信息,活跃不活跃,或者登陆未登录,打卡状态,只有两个状态的都可以使用。
使用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 1
(integer) 0
127.0.0.1:6379> setbit sign 3 0
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> getbit sign 3 #查看某天是否打卡
(integer) 0
127.0.0.1:6379> BITCOUNT sign #查看打卡天数
(integer) 3