GEO类型是一种存储地理信息
的数据格式。使用经度纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用,因为Geospatial的底层就是zset。
命令 | 说明 |
---|---|
geoadd key longitud(经度) latitude(纬度) member [ … ] | 将具体经纬度的坐标存入一个有序集合 |
geopos key member [ member … ] | 获取集合种的一个/多个成员坐标 |
geodist key member1 member2 [ unit ] | 返回两个给定位置之间的距离。默认是以米作为单位 |
georadius key longitude latitude radius m/km/mi/ft [ withcoord ] [ withdist ] [ withhash ] [ count count ] | 以给定的经纬度为中心,返回集合包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素 |
geradiusbymember key member radius … | 功能与georadius相同,只是中心位置不是具体的经纬度,而是使用集合中已有的成员作为中心点 |
geohash key member1 [ member2 … ] | 返回一个或多个位置元素的geohash,使用geohash位置52点整数编码 |
- 有效的经度从-180度到180度
- 有效的维度从-85.05112878度到85.05112878度
指定单为的参数 unit 必须是一下单位之一:
关于georadius的参数
- 通过 georadius 就可以完成附近的人的功能
- withcoord:带上坐标
- withdist:带上距离,单位与半径单位相同
- count n:只显示前n个(按距离递增排序)
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing 121.47 31.23 shanghai # 给china:city 添加两个城市,并指定经纬度
(integer) 2
127.0.0.1:6379> geohash china:city beijing # 获取china:city中的beijing这个成员的geohash字符串
1) "wx4fbxxfke0"
127.0.0.1:6379> zrange china:city 0 -1 # 获取所有的china:city中的所有成员
1) "shanghai"
2) "beijing"
127.0.0.1:6379> zrem china:city beijing # 移除beijing这个成员
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "shanghai"
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geodist china:city beijing shanghai # 查看beijing与shanghai之间的直线距离,默认单位为m
"1067378.7564"
127.0.0.1:6379> geodist china:city beijing shanghai km # 显示两地直线距离,单位为km
"1067.3788"
127.0.0.1:6379> georadius china:city 111 31 1000 km # 以(111,31)为中心,1000km为半径 搜索在该范围的成员
1) "shanghai"
127.0.0.1:6379> georadius china:city 111 31 1000 km withcoord withdist # 追加参数,显示距离和坐标
1) 1) "shanghai"
2) "996.9549"
3) 1) "121.47000163793563843"
2) "31.22999903975783553"
127.0.0.1:6379> georadius china:city 111 31 2000 km # 以(111,31)为中心,找半径2000km以内的成员
1) "shanghai"
2) "beijing"
127.0.0.1:6379> georadius china:city 111 31 2000 km withcoord withdist count 1 # 追加count,只显示一条记录
1) 1) "shanghai"
2) "996.9549"
3) 1) "121.47000163793563843"
2) "31.22999903975783553"
127.0.0.1:6379> georadiusbymember china:city shanghai 1000 km # 以shanghai为中心,搜索附近1000km以内的成员
1) "shanghai"
基数统计
的 数据结构,Hyperlog log的优点是:在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的、并且是很小的。12KB
的内存,就可以计算接近2^64
个不同元素的基数。命令 | 说明 |
---|---|
pfadd key element1 [ element2… ] | 添加指定元素到Hyperloglog中 |
pfcount key [ key ] | 返回给定 Hyperloglog 的基数估算值 |
pfmerge destkey sourcekey [ sourcekey … ] | 将多个 Hyperloglog合并为一个Hyperloglog |
127.0.0.1:6379> pfadd mypf a b c d e f g h i j k # 给mypf添加元素
(integer) 1
127.0.0.1:6379> type mypf # hyperloglog底层使用String
string
127.0.0.1:6379> pfcount mypf # 统计mypf的基数
(integer) 11
127.0.0.1:6379> pfadd mypf i j k z m
(integer) 1
127.0.0.1:6379> pfcount mypf # 统计基数(不重复的元素个数)
(integer) 13
127.0.0.1:6379> pfadd mypf2 a b c n
(integer) 1
127.0.0.1:6379> pfmerge newpf mypf mypf2 # 合并mypf 和mypf2 到newpf
OK
127.0.0.1:6379> pfcount newpf
(integer) 18
传统实现,存储用户的id,然后每次进行比较。当用户变多之后这种方式及其浪费空间,而我们的目的只是计数,Hyperloglog就能帮助我们利用最小的空间完成。
用位存储
的数据结构,信息状态只有0 和 1
命令 | 说明 |
---|---|
setbit key offset value | 为指定key的offset位设置值 |
getbit key offset | 获取offset位的值 |
bitcount key [ start end ] | 统计字符串被设置位1 的bit树,也可以指定统计范围(按字节) |
bitop perration destkey key [ key … ] | 对一个或多个保存二进制位的字符串key 进行元操作,并将结果保存到destkey上 |
bitpos key bit [ start ] [ end ] | 返回字符串里面第一个被设置为1或0的bit位,start和end只能按字节,不能按位 |
127.0.0.1:6379> setbit sign 0 1 # 设置sign的第0位为1
(integer) 0
127.0.0.1:6379> setbit sign 2 1 # 设置sign的第2位为1 ,第一位没设置 默认是0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> type sign
string
127.0.0.1:6379> getbit sign 2 # 获取sign的第2为的数值
(integer) 1
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 4 # 未设置默认是0
(integer) 0
127.0.0.1:6379> bitcount sign # 统计sign中1的位数
(integer) 4
127.0.0.1:6379> bitpos sign 1 0 -1 # 返回字符串里面第一个被设置为1的bit位
(integer) 0
127.0.0.1:6379> setbit aaa 0 1
(integer) 0
127.0.0.1:6379> setbit aaa 1 0
(integer) 0
127.0.0.1:6379> setbit aaa 2 1
(integer) 0
127.0.0.1:6379> setbit bbb 0 0
(integer) 0
127.0.0.1:6379> setbit bbb 1 1
(integer) 0
127.0.0.1:6379> setbit bbb 2 1
(integer) 0
# aaa 101
# bbb 011
127.0.0.1:6379> bitop and res aaa bbb # 对aaa和bbb进行and运算,并将结果保存到res中
(integer) 1
127.0.0.1:6379> getbit res 0
(integer) 0
127.0.0.1:6379> getbit res 1
(integer) 0
127.0.0.1:6379> getbit res 2
(integer) 1
127.0.0.1:6379> bitop or res-or aaa bbb # 对aaa和bbb进行or运算,并将结果保存到res-or中
(integer) 1
127.0.0.1:6379> getbit res-or 0
(integer) 1
127.0.0.1:6379> getbit res-or 1
(integer) 1
127.0.0.1:6379> getbit res-or 2
(integer) 1
127.0.0.1:6379> bitop not res-not aaa # 对aaa进行not运算,并将结果保存到res-not中
(integer) 1
127.0.0.1:6379> getbit res-not 0
(integer) 0
127.0.0.1:6379> getbit res-not 1
(integer) 1
127.0.0.1:6379> getbit res-not 2
(integer) 0
127.0.0.1:6379> bitop xor res-xor aaa bbb # 对aaa和bbb进行xor运算,并将结果保存到res-xor中
(integer) 1
127.0.0.1:6379> getbit res-xor 0
(integer) 1
127.0.0.1:6379> getbit res-xor 1
(integer) 1
127.0.0.1:6379> getbit res-xor 2
(integer) 0
127.0.0.1:6379>