geoadd 添加地理位置信息
该命令以采用标准格式的参数x y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001规定如下:
有效的经度从-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 127.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 108.94 34.26 xian
(integer) 1
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 120.26 30.24 hangzhu
(integer) 1
geopos 获取指定城市的经度和纬度
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
geodist 获取指定城市之间的距离,单位自选
127.0.0.1:6379> geodist china:city beijing xian km
"911.3409"
georadius 以给定的经纬度为中心,找出某一半径内的元素
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km #以110,30这个经纬度为中心,寻找方圆1000km内的城市
1) "xian"
2) "shenzhen"
3) "hangzhu"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist #显示到中间距离的位置
1) 1) "xian"
2) "484.2186"
2) 1) "shenzhen"
2) "924.6408"
3) 1) "hangzhu"
2) "987.1218"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord
1) 1) "xian"
2) 1) "108.93999785184860229"
2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist count 2 #筛选出指定的结果!
1) 1) "xian"
2) "484.2186"
2) 1) "shenzhen"
2) "924.6408"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km #以北京为中心,找出半径1000km内的城市
1) "beijing"
2) "xian"
geohash 将城市的经纬度转换为11个字符的字符串,如果两个字符串越接近,则距离越近
127.0.0.1:6379> geohash china:city shanghai xian
1) "wvd9sthzfm0"
2) "wqj6yuzdvy0"
geo底层就是zset,可以使用zset来操作geo
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "xian"
2) "shenzhen"
3) "hangzhu"
4) "shanghai"
5) "beijing"
127.0.0.1:6379> zrem china:city shanghai
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "xian"
2) "shenzhen"
3) "hangzhu"
4) "beijing"
基数
A{1,3,5,7,8,7}
B{1,3,5,7,8}
基数(不重复的元素)=5,(可以接受的误差)
Redis 2.8.9版本就更新了Hyperloglog数据结构。Redis Hyperloglog基数统计的算法
网页的UV(一个人访问一个网站多次,但是还是算作一个人)
传统的方式,set保存用户的id,然后就可以统计set 中的元素数量作为标准判断。这个方式如果保存大量的用户id,就会比较麻烦。目的是为了计数,而不是保存用户id 。
Hyperloglog会有0.81%的错误率,但对于统计任务来说,可忽略不计。
127.0.0.1:6379> PFADD mycount 1 2 3 4 5 6 7 8 9 #创建第一组元素mykey
(integer) 1
127.0.0.1:6379> PFCOUNT mycount #计数mycount元素个数
(integer) 9
127.0.0.1:6379> pfadd mycount2 2 6 5 47 8 9 1 2 3
(integer) 1
127.0.0.1:6379> pfcount mycount2
(integer) 8
127.0.0.1:6379> PFMERGE mycount3 mycount mycount1 #合并mycount mycount1至mycount3
OK
127.0.0.1:6379> PFCOUNT mycount3
(integer) 9
综上比较:
允许容错,则可以使用hyperloglog
如果不允许,就使用set或自定义数据类型
位储存
bitmaps:位图,数据结构。都是通过二进制位来进行记录。
统计用户信息,活跃/不活跃。
setbit (setbit 图名 位置 值 )设置位图某一位置的值
getbit 获取某一位置的值
统计一周七天打卡情况(0代表未打卡,1代表打卡)
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 1
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(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 4
(integer) 0