3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps

1.geospatial(地理位置详解)

geospatial可以干什么?

  • 朋友的定位,附近的人,打车距离的计算

geospatial只有6个命令

  • geoadd :添加数据,但是这么很麻烦,我们一般使用java代码,进行添加
  • geopos :获得当前的定位,一定是一个坐标值,也就是获得我们输入的数据
  • geodist :计算距离
  • georadius :以某某为中心,x为半径,查询半径内的数据
  • georadiusbymember :找出位于指定元素周围的其他元素
  • geohash :使用hash 来返回坐标值

1.1、geoadd:

  • 注意:添加城市数据,两极无法直接添加,我们一般会下载城市数据,直接通过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 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> 

3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps_第1张图片

1.2、geopos:

  • 查看录入数据城市的经纬度
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> 

3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps_第2张图片

1.3、geodist:

  • 查看两个城市之间的直线距离
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> 

3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps_第3张图片
北京到上海的直线距离,百度查询 1088
3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps_第4张图片
说明还是有误差

1.4、georadius:

  • 以xx为中心,xx为半径,找寻半径内存在的数据
  • 这里无法使用录入的城市数据名为中心
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> 

3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps_第5张图片

1.5、georadiusbymember:

  • 找到成员的距离,城市之间的定位
  • 找出位于指定元素周围的其他元素
  • 注意对比georadius
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> 

3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps_第6张图片

1.6、geohash:

  • geohash 命令,返回一个或者多个元素的geohash表示
  • 该命令返回11个字符串的geohash字符串
  • 将二维的经纬度,转换为1维的字符串,如果2个字符越接近,那么则距离越近!

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> 

3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps_第7张图片

  • geo底层的实现原理就是Zset! 我们可以使用Zset命令来操作geo
  • 删除城市数据zrem
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> 


2.hyperloglog(基数统计)

  • 什么是基数?
    a{1,3,5,7,9}
    b{1,2,3,4,5,6}
  • 基数:不重复的元素 :ab的基数是12345679 ,hyperloglog允许接受误差!

简介

  • Redis 2.8.9 版本就更新了Hypeloglog数据结构!

  • Hypeloglog 是用来做基数统计的算法!

  • 网页的UV (一个人访问一个网站,算做一次,但是一个人多次同时访问一个网站,我们也只算作是一个人)

  • 传统的方式 set 保存用户的id 然后就可以统计set中的元素数量作为标准判断!

  • 这个方式保存大量的用户id就会比较麻烦,我们的目的是为了计数,而不是为了保存用户id

优点 :

占用的内存是固定的 2^64 不同元素的计数,只需要12KB的内存,如果要从内存角度来比较的话,hyperloglog首选

0.81% 错误率 统计uv任务,可以忽略不计的!

如果不允许容错,就别用它

2.1 、pfadd

  • 添加数据
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> 

3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps_第8张图片

2.2 、pfcount

  • 查看数据
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> 


3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps_第9张图片

2.3 、pfmerge

  • 将两个基数合并在一起,成为一个基数
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> 

3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps_第10张图片

3.bitmaps

位存储用处:

疫情:0000000,如果被感染 写为1 统计疫情感染人数,

统计用户信息 ,活跃 不活跃

登陆 , 没登录 打卡365 打卡

两个状态的都可以使用bitmaps

bitmaps位图,数据结构,都是操作二进制位来进行记录,就只有0 1 两个状态

365天 = 365bit 1字节 = 8 bit 46个字节左右

3.1、setbit

  • 打个比方登记打卡
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> 

3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps_第11张图片

3.2、getbit

  • 查看当天打卡情况
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> 

3. Redis三大特殊类型geospatial ,hyperloglog,bitmaps_第12张图片

3.3、bitcount

  • 查看一段时间内的打卡情况
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> 

你可能感兴趣的:(Redis)