三个特殊数据类型

发布时间 2023-08-27 13:39:35作者: AnJiaYu

三个特殊数据类型

geospatial(地理位置)

朋友的定位 附近的人

查询地理信息数据:城市经纬度查询-国内城市经度纬度在线查询工具 (jsons.cn)

这个功能在3.2版本就推出了

添加城市位置

 

 

#geoadd 添加地理位置
#规则 地球两极是无法直接添加的,一般我们会下载城市数据 利用Java程序一次性导入
#填写规则是纬度经度 不要写反 但是redis会检查输入的经纬度的值 如果超出限制会出现错误
127.0.0.1:6379> GEOADD china:city 116.405285 39.904989 beijing
(integer) 1
127.0.0.1:6379> GEOADD china:city 121.472644 31.231706 shanghai
(integer) 1
127.0.0.1:6379> GEOADD china:city 125.3245 43.886841 jilin
(integer) 1
127.0.0.1:6379> GEOADD china:city 114.085947 22.547 shenzhen
(integer) 1
127.0.0.1:6379> GEOADD china:city 126.642464 45.756967 haerbin 117.190182  39.125596 tianjin
(integer) 2
127.0.0.1:6379>


查询一个地方的经度纬度 一定是一组坐标值

127.0.0.1:6379> GEOPOS china:city beijing
1) 1) "116.40528291463851929"
  2) "39.9049884229125027"
127.0.0.1:6379> GEOPOS china:city beijing shanghai
1) 1) "116.40528291463851929"
  2) "39.9049884229125027"
2) 1) "121.47264629602432251"
  2) "31.23170490709807012"
127.0.0.1:6379>

计算两个地理位置之间的绝对距离

如果两个位置之间的其中一个不存在, 那么命令返回空值。

指定单位的参数 unit 必须是以下单位的其中一个:

  • m 表示单位为米。

  • km 表示单位为千米。

  • mi 表示单位为英里。

  • ft 表示单位为英尺。

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

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

127.0.0.1:6379> GEODIST china:city beijing shanghai km
"1067.5980"
127.0.0.1:6379>

我附近的人(获得周围所有人的定位) 通过半径来查 还可以通过指定的count来反回一定数量的数据

127.0.0.1:6379> GEORADIUS china:city 123 44 500 km
1) "jilin"
2) "haerbin"
127.0.0.1:6379>

GEORADIUSBYMEMBER

通过一个元素的位置来进行搜索

比如搜索北京1000公里内的所有城市


127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "tianjin"
2) "beijing"
3) "jilin"
127.0.0.1:6379>

geohash

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

127.0.0.1:6379> GEOHASH china:city beijing
1) "wx4g0b7xrt0"
127.0.0.1:6379>

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

127.0.0.1:6379> ZRANGE china:city 0 -1
1) "shenzhen"
2) "shanghai"
3) "tianjin"
4) "beijing"
5) "jilin"
6) "haerbin"
127.0.0.1:6379>

 

Hyperloglog

什么是基数

A{1,3,5,7,8,9} B{1,3,5,7,8}

基数指的是 不重复的元素 比如这里面的元素 不重复的元素 是 1 3 5 7 8 那么基数就是 5

统计网站的访问量 (一个人多次访问 算成一个人)

传统方式 使用set集合 利用其唯一的特性 来保存访问的数量

这个方法如果保存大量的用户id 就会格外的麻烦 我们只是为了计数 而不是为了保存用户id

采用hyperloglog的优点就是 占用内存是固定的 采用2的64次方进行计数 只需要12kb的内存

如果要从内存角度来比较的话 那么这个方法应该是首选的

但是这个方法有着0.81%的错误率 如果对数据的精准性要求不是很高的情况

127.0.0.1:6379> PFADD mypf1 a b c d e f g h i 
(integer) 1
127.0.0.1:6379> PFADD mypf2 h g i m k l u t r
(integer) 1
127.0.0.1:6379> PFCOUNT mypf1
(integer) 9
127.0.0.1:6379> PFCOUNT mypf2
(integer) 8
127.0.0.1:6379> PFMERGE mypf3 mypf2 mypf1
OK
127.0.0.1:6379> PFCOUNT mypf3
(integer) 14
127.0.0.1:6379>

 

Bitmap

位存储

统计用户信息 登录 未登录 打卡 未打卡 活跃 不活跃

两种状态的 都可以使用这个

bitmap 位图 数据结构 使用二进制 只有两个状态

测试 使用bitmap 来记录一周的打卡


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> SETBIT sign  4 1
(integer) 0
127.0.0.1:6379> SETBIT sign  5 0
(integer) 0
127.0.0.1:6379> SETBIT sign  6 1
(integer) 0
127.0.0.1:6379>

查看某一天是否打卡

127.0.0.1:6379> GETBIT sign 6
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> GETBIT sign 5
(integer) 0
127.0.0.1:6379>

统计打卡天数

127.0.0.1:6379> BITCOUNT sign 0 -1
(integer) 4
127.0.0.1:6379>