Redis之三大特殊数据类型:Geospatial:地理位置 hyperloglog:实现的功能是计算统计 bitmaps:位存储

三大特殊数据类型结构,十分的少见但是开源项目中依然有它们的身影

Geospatial:地理位置

实现的功能:附近的人,城市与城市之前的距离计算

添加城市经纬度到key中,经纬度则是key的value值,在正常的开发过程中,这些数据是通过java导入即可,不需要手动添加

添加命令

        geoadd

格式

        geoadd key value【纬度 精度 城市名】

geoadd 

[root@localhost redis]# ./bin/redis-cli -p 6379             客户端登录redis
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 117.55 34.85 zaozhuang 110.33 20.00 hainan        添加多个城市的经纬度,上海 枣庄 海南
(integer) 3

Geopos:查询添加key中的数据

127.0.0.1:6379> GEOPOS china:city beijing    查询一个城市,北京经纬度
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
127.0.0.1:6379> GEOPOS china:city zaozhuang hainan  查询多个城市经纬度,枣庄海南
1) 1) "117.55000144243240356"
   2) "34.8499990842851517"
2) 1) "110.32999902963638306"
   2) "20.00000058910486445"
127.0.0.1:6379>   

 Geodis :可以查询两地的距离

127.0.0.1:6379> GEODIST china:city zaozhuang beijing km 

                                                                        查询枣庄到北京的直线距离单位为 km
"570.8001"

 

注意:距离有点差距,因为经纬度并不是十分的精确,但是差的并不是很多

georadius:以给定的经纬度为中心,找到某一半径的元素

127.0.0.1:6379> ZRANGE china:city 0 -1     集合中已存在的所有键,查询则是在集合的基础上进行查询
1) "hainan"
2) "shanghai"
3) "zaozhaung"
4) "beijing"
127.0.0.1:6379> 

以经纬度110 30为中2000km为半径画个圆,找到集合中在⚪中的数据

127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km   
1) "shanghai"
2) "zaozhaung"
3) "beijing"
4) "hainan"

查询数据,并附带着城市的经纬度
127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km withcoord 
1) 1) "shanghai"
   2) 1) "121.47000163793563843"
      2) "31.22999903975783553"
2) 1) "zaozhaung"
   2) 1) "117.55000144243240356"
      2) "34.8499990842851517"
3) 1) "beijing"
   2) 1) "116.39999896287918091"
      2) "39.90000009167092543"
4) 1) "hainan"
   2) 1) "110.32999902963638306"
      2) "20.00000058910486445"

查询数据并附带着城市距离这个⚪的距离
127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km withdist
1) 1) "shanghai"
   2) "1105.9098"     距离
2) 1) "zaozhaung"
   2) "890.2686"      距离
3) 1) "beijing"     
   2) "1245.2858"    距离
4) 1) "hainan"
   2) "1112.7582"    距离

127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km withdist count 1  

                                                        count则表示:只显示一个数据,显示最近的那个城市
1) 1) "zaozhaung"
   2) "890.2686"
127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km withdist count 2

                                                                显示两个城市
1) 1) "zaozhaung"
   2) "890.2686"
2) 1) "shanghai"
   2) "1105.9098"

 GEORADIUSBYMEMBER :根据城市为中心进行查找

上面的georadius是通过给定的经纬度为中心进行查找,而这个则是通过结合中已经存在的城市为中心进行查找

127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km

                        以集合中北京为中1000km为半径,枣庄则是在⚪中
1) "zaozhaung"
2) "beijing"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km withcoord

                                                                附带查询到数据的经纬度
1) 1) "zaozhaung"
   2) 1) "117.55000144243240356"
      2) "34.8499990842851517"
2) 1) "beijing"
   2) 1) "116.39999896287918091"
      2) "39.90000009167092543"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km withdist

                                                                附带查询城市的距离
1) 1) "zaozhaung"
   2) "570.8001"
2) 1) "beijing"
   2) "0.0000"
127.0.0.1:6379> 

Geohash:返回一个或多个元素,是通过hash来进行表示

返回值则是11个字符的Geohash的字符串

是将二维的经纬度转换为一维的字符串

注意:如果两个返回值越接近,表示两个城市距离就越近

127.0.0.1:6379> GEOHASH china:city beijing zaozhaung
1) "wx4fbxxfke0"
2) "ww5w6bjrcw0"
127.0.0.1:6379>  

Geo实现的底层原理就是五大基本数据类型的zset,在redis.io的官方文档中,并没有介绍关于删除集合信息的命令,但是我们可以通过底层原理去实现键的删除 

127.0.0.1:6379> ZRANGE china:city 0 -1   查询集合中的所有数据
1) "hainan"
2) "shanghai"
3) "zaozhaung"
4) "beijing"
127.0.0.1:6379> ZREM china:city zaozhaung      删除枣庄这个城市的数据
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1    删除成功
1) "hainan"
2) "shanghai"
3) "beijing"
127.0.0.1:6379> 

hyperloglog:实现的功能是计算统计

例如:统计网页的访问量(注意一点:redis功能具有一定的容错,并不是完全正确)

基数:结合中不重复的元素个数,可以极少的占用内存

127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> PFADD key1 a b c d e f g              创建两个集合分别放着不同的信息
(integer) 1
127.0.0.1:6379> PFADD key2 e f g h i j k
(integer) 1
127.0.0.1:6379> PFCOUNT key1                         查看集合1中的元素个数
(integer) 7
127.0.0.1:6379> PFCOUNT key2                               
(integer) 7
127.0.0.1:6379> PFMERGE key3 key1 key2          将集合一与集合二整合到集合三中
OK
127.0.0.1:6379> PFCOUNT key3                        这里显示的则是两个集合中的基数
(integer) 11
127.0.0.1:6379> 

bitmaps:位存储

统计信息:只有两种情况的例如:登录,未登录  签到 未签到

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

127.0.0.1:6379> setbit sign 0 1   假设一每周签到为前提 1 表示已签到 0 表示没签到

                                                        创建每天签到的状况
(integer) 0

127.0.0.1:6379> setbit sign 1 0       
(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 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0
127.0.0.1:6379> GETBIT sign 1    查看周一是否签到
(integer) 0
127.0.0.1:6379> GETBIT sign 0 查看周天是否签到
(integer) 1
127.0.0.1:6379> BITCOUNT sign    统计已存入信息已签到的个数
(integer) 5
127.0.0.1:6379>  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想睡醒的梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值