Redis三种特殊数据类型之geospatial、Hyperloglog、Bitmaps

三种特殊数据类型

geospatial 地理位置

可以干什么

朋友的定位、附近的人、打车距离计算
辅助查询经纬度测试数据:http://www.daquan.la/jingwei/

只有六个命令

官方文档:https://www.redis.net.cn/order/3685.html
在这里插入图片描述

  • geoadd:添加一个(多个)地理位置

规则:两级无法直接添加,一般下载测试数据,java一次性导入
参数:key 值(经度(-180~180)、纬度(-85.05112878 ~ 85.05112878)、名称)

127.0.0.1:6379[6]> geoadd china:city 115.95 25.55 nanchang
(integer) 1
127.0.0.1:6379[6]> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379[6]> geoadd china:city 116.33 39.89 beijin
(integer) 1
127.0.0.1:6379[6]> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen
(integer) 2
127.0.0.1:6379[6]> geoadd china:city 120.16 30.24 hangzhou
(integer) 1
127.0.0.1:6379[6]> 
  • peopos:获取指定的一个(多个)经度和纬度

获得当前定位:一定是一个坐标值!

127.0.0.1:6379[6]> geopos china:city beijin chongqing
1) 1) "116.3299986720085144"
   2) "39.89000061669732844"
2) 1) "106.49999767541885376"
   2) "29.52999957900659211"
  • geodist:两个城市之间距离(好友之间距离)

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

127.0.0.1:6379[6]> geodist china:city beijin shanghai
"1069113.1187"
127.0.0.1:6379[6]> geodist china:city beijin shanghai km
"1069.1131"
127.0.0.1:6379[6]> geodist china:city beijin nanchang km
"1595.3768"
  • georadius:以给定的经纬度为中心,找出某一半径内的元素(附近的人)

找附近的人?(获得附近的人地址,定位),通过半径查询
获得指定数量
所有数据都录入china:city,才会让结果更精确

#获取110 30经纬度为中心方圆1000km内的城市
127.0.0.1:6379[6]> georadius china:city 110 30 1000 km
1) "chongqing"
2) "shenzhen"
3) "nanchang"
4) "hangzhou"
127.0.0.1:6379[6]> georadius china:city 110 30 500 km
1) "chongqing"
#显示到中心距离的位置
127.0.0.1:6379[6]> georadius china:city 110 30 500 km withdist
1) 1) "chongqing"
   2) "341.9374"
 #显示他人的定位信息
127.0.0.1:6379[6]> georadius china:city 110 30 500 km withcoord
1) 1) "chongqing"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
 #筛选出指定结果
127.0.0.1:6379[6]> georadius china:city 110 30 500 km withdist withcoord count 1
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
  • georadiusbymember:找出位于指定元素周围的其他元素
#位于 beijing 1000km的其他元素
127.0.0.1:6379[6]> georadiusbymember china:city beijin 1000 km
1) "beijin"
127.0.0.1:6379[6]> georadiusbymember china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
  • geohash:返回一个(多个)位置元素的geohash表示
    返回11个字符的geohash字符串!
    两个字符串越接近,距离越近
127.0.0.1:6379[6]> geohash china:city beijin chongqing
1) "wx4dzjubj70"
2) "wm5xzrybty0"
  • geo底层实现原理其实是Zset!
127.0.0.1:6379[6]> zrange china:city 0 -1
1) "chongqing"
2) "shenzhen"
3) "nanchang"
4) "hangzhou"
5) "shanghai"
6) "beijin"
127.0.0.1:6379[6]> zrem china:city beijin
(integer) 1
127.0.0.1:6379[6]> zrange china:city 0 -1
1) "chongqing"
2) "shenzhen"
3) "nanchang"
4) "hangzhou"
5) "shanghai"

Hyperloglog

什么是基数

A{1,3,5,7,9}
B{1,3,5,7,8}
基数(不重复的元素)=5,可以接受误差!

简介

Redis2.8.9版本就更新了Hyperloglog数据结构!
Redis Hyperloglog 基数传统的算法!
优点:占用内存是固定的,2^ 64不同的元素的技术!如果从内存角度比较的话Hyperloglog首选。
网页的uv(一个人访问一个网站多次,但是还是算作一个人!)
传统方式,set保存用户id,可以统计set中元素数量作为标准判断!
这个方式如果保存大量用户id,就比较麻烦!目的为了计数,而不是保存用户id;
0.91%错误率!传统的UV任务,可以忽略不计!

测试数据
127.0.0.1:6379> pfadd pfset a b c d e f g h j j i #创建第一组元素
(integer) 1
127.0.0.1:6379> pfcount pfset #统计第一组元素基数数量
(integer) 10
127.0.0.1:6379> pfadd pfkey a s s s d s r d  #创建第二组
(integer) 1
127.0.0.1:6379> pfcount pfkey
(integer) 4
127.0.0.1:6379> pfmerge pf  pfset pfkey #合并两组
OK
127.0.0.1:6379> pfcount pf #查看并集数量
(integer) 12

如果允许容错,一定可以使用!
不允许就用自己的数据类型!

Bitmaps

位存储:

两个状态的,都可以用:同城感染人数、统计用户信息(活跃、不活跃)、登录,未登录、打卡!

测试数据

使用Bitmaps来记录周一到周日的打卡:

127.0.0.1:6379[8]> setbit sign 0 1
(integer) 0
127.0.0.1:6379[8]> setbit sign 1 0
(integer) 0
127.0.0.1:6379[8]> setbit sign 2 1
(integer) 0
127.0.0.1:6379[8]> setbit sign 3 1
(integer) 0
127.0.0.1:6379[8]> setbit sign 4 0
(integer) 0
127.0.0.1:6379[8]> setbit sign 5 0
(integer) 0
127.0.0.1:6379[8]> setbit sign 6 0
(integer) 0

查看某一天是否有打卡:

127.0.0.1:6379[8]> getbit sign 4
(integer) 0
127.0.0.1:6379[8]> getbit sign 3
(integer) 1

统计操作,统计打卡天数:

127.0.0.1:6379[8]> bitcount sign
(integer) 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值