Redis三种特殊数据类型之Geospatial(地理空间)、Hyperloglog(基数)、Bitmaps(位存储)

Redis三种特殊数据类型之Geospatial(地理空间)、Hyperloglog(基数)、Bitmaps(位存储)

一、Geospatial(地理空间)

中文官方文档 写的非常清楚

Geospatial(地理空间)主要应用在朋友的定位、附近的人、打车距离计算

  1. GEOADD 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
localhost:2>geoadd china:city 116.40 31.23 beijing
"1"
localhost:2>geoadd china:city 121.47 31.23 shanghai
"1"
localhost:2>geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shengzhen
"2"
localhost:2>geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
"2"
  1. GEOPOS 从key里返回所有给定位置元素的位置(经度和纬度)
localhost:2>GEOPOS china:city beijing #查看北京的经纬度
1) 1) "116.39999896287918"
   2) "31.229999039757836"

localhost:2>GEOPOS china:city beijing hangzhou
1) 1) "116.39999896287918"
   2) "31.229999039757836"

2) 1) "120.16000002622604"
   2) "30.240000322949022"
  1. GEODIST 返回两个给定位置之间的距离
localhost:2>GEODIST china:city hangzhou shanghai m #获取杭州到上海的距离(米)
"166761.2770"
localhost:2>GEODIST china:city hangzhou shanghai km
"166.7613"
  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。
  1. GEORADIUS 以给定的经纬度为中心, 找出某一半径内的元素
#查询以 110E 30N为中心 半径为1000km的城市
localhost:2>GEORADIUS china:city 110 30 1000 km 
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "beijing"
5) "hangzhou"
#查询以 110E 30N为中心 半径为500km的城市
localhost:2>GEORADIUS china:city 110 30 500 km
1) "chongqing"
2) "xian"

#查询以 110E 30N为中心 半径为500km的城市并获取所间隔的距离
localhost:2>GEORADIUS china:city 110 30 500 km withdist
1) 1) "chongqing"
   2) "341.9374"

2) 1) "xian"
   2) "483.8340"

#查询以 110E 30N为中心 半径为500km的城市并获取城市的经纬度
localhost:2>GEORADIUS china:city 110 30 500 km withcoord
1) 1) "chongqing"
   2) 1) "106.49999767541885"
      2) "29.529999579006592"


2) 1) "xian"
   2) 1) "108.96000176668167"
      2) "34.2599996441893"


#查询以 110E 30N为中心 半径为500km的城市并获取城市的经纬度和距离 筛选指定的数量
localhost:2>GEORADIUS china:city 110 30 500 km withdist withcoord count 1
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885"
      2) "29.529999579006592"

  1. GEORADIUSBYMEMBER 找出位于指定范围内的元素,中心点是由给定的位置元素决定
localhost:2GEORADIUSBYMEMBER china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
  1. GEOHASH 返回一个或多个位置元素

    该命令将返回11个字符的geohash字符串

    将二维的经纬度转换为一堆的字符串,如果两个字符串越接近,那么距离越近

localhost:2>geohash china:city beijing chongqing
1) "wtdc8tpzut0"
2) "wm5xzrybty0"

GEO的底层原理其实是Zset 我们可以使用Zset命令来操作geo

localhost:2>zrange china:city 0 -1  #查看全部的元素
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "beijing"
5) "hangzhou"
6) "shanghai"
localhost:2>zrem china:city xian #去除其中指定的元素
"1"
localhost:2>zrange china:city 0 -1
1) "chongqing"
2) "shengzhen"
3) "beijing"
4) "hangzhou"
5) "shanghai"

二、Hyperloglog(基数)

Redis Hyperloglog 基数统计的算法

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

网页的UV访问量(一个人访问一个网站多次,但是还是算作一个人)

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

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

扫描二维码关注公众号,回复: 13181399 查看本文章

允许0.81*%的错误率,统计UV任务时,是可以忽略不计的

localhost:2> pfadd mykey a b c d e f g h i j  #创建第一组元素
"1"
localhost:2>pfcount mykey   #统计mykey元素的基数数量
"10"
localhost:2>pfadd mykey2 i j z x l m n   #创建第二组元素
"1"
localhost:2>pfcount mykey2
"7" 
localhost:2>PFMERGE mykey3 mykey mykey2  #合并两组 mykey mykey2 --> mykey3
"OK"
localhost:2>pfcount mykey3
"15"

三、Bitmaps(位存储)

统计用户信息:活跃、不活跃! 登录、不登录!打卡记录 使用两个状态来记录的话,都可以使用Bitmaps

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

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

我是听狂神的课并进行记录。狂神说的非常好,大家快去学狂神说Java

猜你喜欢

转载自blog.csdn.net/weixin_43484014/article/details/117424679