Redis三种特殊数据类型(Geospatial地理位置详解,Hyperloglog基数统计,Bitmap位图场景详解)

学习总结,转自【狂神说Java】Redis最新超详细版教程通俗易懂_哔哩哔哩_bilibili

1.Geospatial 地理位置

Geospatial : 使用场景 :朋友的定位,方圆几公里得人(附近的人),判断两地之间直线距离

注意事项:

 设置/获取经纬度

//添加地理位置,格式(经度,维度,名称)
127.0.0.1:6379> geoadd china:city 120.16  30.24 hangzhou  
(integer) 1
127.0.0.1:6379> geoadd china:city 116.40  39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing
(integer) 1


//获取指定城市的经纬度
127.0.0.1:6379> getpos china:city hangzhou  beijing
1) 1) "116.39999896287918"
   2) "39.900000091670925"

查看距离

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

    如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

    GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差

//查看距离
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"

找出半径内的城市

//给定的经纬度为中心,找出单位半径内的城市
georadius china:city 110 30 1000 km
1) "chongqing"

找出半径内的城市显示支线距离

127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "chongqing"
   2) "341.9374"
      

找出半径内的城市并显示经纬度

127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord
1) 1) "chongqing"
   2) 1) "106.49999767541885"
      2) "29.529999579006592"

批量展示半径内的城市并显示经纬度及直线距离

127.0.0.1:6379> georadius china:city 110 30 500 km  withdist withcoord count 1
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885"
      2) "29.529999579006592"

找出指定元素周围的其他元素

 127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"

将二维的经纬度转为一维的字符串(11位),字符串约相同,代表经纬度约接近

127.0.0.1:6379> geohash china:city beijing chongqing
1) "wx4fbxxfke0"
2) "wm5xzrybty0"

geo的底层实现原理是Zset,可以使用Zset操作geo

//查看所有城市
127.0.0.1:6379>  zrange china:city 0 -1
1) "chongqing"
2) "shanghai"
3) "beijing"

//移除指定元素
127.0.0.1:6379> zrem china:city shanghai
(integer) 1

127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "beijing"

2.Hyperloglog

统计基数的算法

优点:占用的内存固定2^64,不同元素的数据只需要12KB的内存,但是会有0.81%的错误率

例如统计网站使用用户数量时,传统的方式使用set保存用户id,统计set中的元素数量进行判断,存储大量id就比较麻烦,

如果在不考虑容错的情况下,推荐使用Hyperloglog存储,

如果不允许容错,就是要set或自己的数据类型即可

//创建第一组元素
127.0.0.1:6379> PFADD mykey a b c d e f g h i j
(integer) 1
//统计元素mykey基数数量
127.0.0.1:6379> PFCOUNT mykey
(integer) 10
 //创建第二组元素
127.0.0.1:6379> PFADD mykey2 i j z x c v b n m 
(integer) 1
 
//统计元素mykey2基数数量
127.0.0.1:6379> PFCOUNT mykey2
(integer) 9

//合并两组 mykey  mykey2 至 mykey3
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2
 ok

//查看并集数量
127.0.0.1:6379> PFCOUNT mykey2
(integer) 15

3.BatMap

主要用于统计用户信息,活跃/不活跃,登录/未登录,两种状态的都可以使用BatMap进行记录,

使用BatMap位图,数据结构,都是二进制操作进行记录,只有0和1两种

例:以使用BatMap存储员工每天打卡情况(0为未打卡,1为打卡)

//s设置员工一周打卡情况
127.0.0.1:6379> setbit sign 0 1  // 周一
(integer) 0
127.0.0.1:6379> setbit sign 1 0  // 周二
(integer) 0
127.0.0.1:6379> setbit sign 2 0  // 周三
(integer) 0
127.0.0.1:6379> setbit sign 3 1  // 周四
(integer) 0
// .....以此类推

//查看员工某天打卡情况
127.0.0.1:6379> getbit sign 3
//返回1 ,代表当天打卡

127.0.0.1:6379> getbit sign 6
//返回0 代表未打卡


//统计打卡天数
127.0.0.1:6379> bitcount sign
//返回 3 代表员工本周打卡三天

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值