geospatial可以干什么?
geospatial只有6个命令
添加城市经纬度
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 chongqin # 添加城市的经纬度,这里是重庆 前面是经度,后面是纬度
(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.16 30.24 hangzhou 108.96 34.26 xian # 添加城市的经纬度,这里是杭州和西安 前面是经度,后面是纬度
(integer) 2
127.0.0.1:6379>
127.0.0.1:6379> keys *
1) "china:city"
127.0.0.1:6379> geopos china:city shanghai # 查看上海的经纬度
1) 1) "121.47000163793563843"
2) "31.22999903975783553"
127.0.0.1:6379> geopos china:city beijing # 查看北京的经纬度
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city shenzhen # 查看深圳的经纬度
1) 1) "114.04999762773513794"
2) "22.5200000879503861"
127.0.0.1:6379>
127.0.0.1:6379> geodist china:city beijing shanghai km # 计算北京到上海的直线距离
"1067.3788"
127.0.0.1:6379> geodist china:city beijing chongqin km # 计算北京到重庆的直线距离
"1464.0708"
127.0.0.1:6379>
127.0.0.1:6379> georadius china:city 110 30 1000 km # 查找以经度110 纬度30为中心,1000km为半径的 ,china:city里面符合条件的数据
1) "chongqin"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379>
127.0.0.1:6379> georadiusbymember china:city shanghai 1000 km # 以china:city 中的城市 上海为中心,半径为1000km ,查找china:city 里面在1000km里面的城市
1) "hangzhou"
2) "shanghai"
127.0.0.1:6379> georadiusbymember china:city beijing 500 km # 以china:city 中的城市 北京为中心,半径为500km ,查找china:city 里面在500km里面的城市
1) "beijing"
127.0.0.1:6379>
127.0.0.1:6379> geohash china:city beijing shanghai chongqin # 将china:city里面城市坐标的经纬度,转换为11为的hash字符串
1) "wx4fbxxfke0"
2) "wtw3sj5zbj0"
3) "wm5xzrybty0"
127.0.0.1:6379>
127.0.0.1:6379> zrange china:city 0 -1 # 查看所有城市
1) "chongqin"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrange china:city 1 3
1) "xian"
2) "shenzhen"
3) "hangzhou"
127.0.0.1:6379> zrangebyscore china:city -inf +inf # 升序排列
1) "chongqin"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
127.0.0.1:6379> zrem china:city chongqin # 删除城市的数据
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "xian"
2) "shenzhen"
3) "hangzhou"
4) "shanghai"
5) "beijing"
127.0.0.1:6379>
简介
Redis 2.8.9 版本就更新了Hypeloglog数据结构!
Hypeloglog 是用来做基数统计的算法!
网页的UV (一个人访问一个网站,算做一次,但是一个人多次同时访问一个网站,我们也只算作是一个人)
传统的方式 set 保存用户的id 然后就可以统计set中的元素数量作为标准判断!
这个方式保存大量的用户id就会比较麻烦,我们的目的是为了计数,而不是为了保存用户id
优点 :
占用的内存是固定的 2^64 不同元素的计数,只需要12KB的内存,如果要从内存角度来比较的话,hyperloglog首选
0.81% 错误率 统计uv任务,可以忽略不计的!
如果不允许容错,就别用它
127.0.0.1:6379> pfadd myhyperloglog1 a b c d e f g h i j # 存入数据到myhyperloglog1
(integer) 1
127.0.0.1:6379> pfadd myhyperloglog2 i j k l m n o p q r # 存入数据到myhyperloglog2
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> pfcount myhyperloglog1 # 查看myhyperloglog1里面的数据有多少个不重复的
(integer) 10
127.0.0.1:6379> pfcount myhyperloglog2
(integer) 10
127.0.0.1:6379> pfadd myhyperloglog3 i j k l m n o p q r i i i i
(integer) 1
127.0.0.1:6379> pfcount myhyperloglog3 # 查看myhyperloglog3里面的数据有多少个不重复的
(integer) 10
127.0.0.1:6379>
127.0.0.1:6379> pfmerge heti myhyperloglog1 myhyperloglog2 # 将myhyperloglog1 myhyperloglog2合并到heti里面,heti也是基数
OK
127.0.0.1:6379> pfcount heti # 查看里面有多少个数据
(integer) 18
127.0.0.1:6379>
位存储用处:
疫情:0000000,如果被感染 写为1 统计疫情感染人数,
统计用户信息 ,活跃 不活跃
登陆 , 没登录 打卡365 打卡
两个状态的都可以使用bitmaps
bitmaps位图,数据结构,都是操作二进制位来进行记录,就只有0 1 两个状态
365天 = 365bit 1字节 = 8 bit 46个字节左右
127.0.0.1:6379> setbit sign 0 1 # 第1天打卡成功
(integer) 0
127.0.0.1:6379> setbit sign 1 0 # 第2天打卡失败
(integer) 0
127.0.0.1:6379> setbit sign 2 1 # 第3天打卡成功
(integer) 0
127.0.0.1:6379> setbit sign 3 1 # 第4天打卡成功
(integer) 0
127.0.0.1:6379> setbit sign 4 0 # 第5天打卡失败
(integer) 0
127.0.0.1:6379> setbit sign 5 1 # 第6天打卡成功
(integer) 0
127.0.0.1:6379> setbit sign 6 1 # 第7天打卡成功
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> getbit sign 3 #第四天打卡成功
(integer) 1
127.0.0.1:6379> getbit sign 1 #第二天打卡失败
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> bitcount sign 0 6 # 一周内打卡成功4天
(integer) 4
127.0.0.1:6379> bitcount sign 1 4 # 周二到周五 打卡
(integer) 0
127.0.0.1:6379>