0
点赞
收藏
分享

微信扫一扫

三种特殊数据类型​


geospatial(地理位置)

朋友的定位,附近的人,打车距离计算

redis的Geo在redis3.2版本推出了,这个功能可以推算地理位置信息,两地之间的距离,方圆几里的人。

可以查询一些测试数据

只有6个命令

三种特殊数据类型​_redis






官方文档: https://www.redis.net.cn/order/3685.html

geoadd


# geoadd 添加地理位置

# 规则:2极无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入

# 有效经度从-180到180度

# 有效的维度从-85.05112878度到85.05112878度

# 当坐标位置超出上述指定范围时,该命令将会返回一个错误

127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing

(error) ERR invalid longitude,latitude pair 39.900000,116.40000

参数key 值(经度,维度,名称)


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

(integer) 1

127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqin 114.05 22.52 shengzhen

(integer) 2

127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian

(integer) 2

127.0.0.1:6379>


geopos


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


127.0.0.1:6379> geopos china:city Beijing获取指定城市的经度和纬度

1) 1) "116.39999896287918091"

2) "39.90000009167092543"

127.0.0.1:6379> geopos china:city beijing chongqin

1) 1) "116.39999896287918091"

2) "39.90000009167092543"

2) 1) "106.49999767541885376"

2) "29.52999957900659211"

127.0.0.1:6379>


geodist


两人之间的距离

单位:

  1. m 表示单位为米
  2. km 表示单位为千米
  3. mi 表示单位为英里
  4. ft 表示单位为英尺

127.0.0.1:6379> geodist china:city beijing chongqin km查看北京到重庆的直线距离

"1464.0708"

127.0.0.1:6379> geodist china:city beijing shanghai km查看北京到上海的直线距离

"1067.3788"

127.0.0.1:6379>


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


我附近的人(获取所有附近人的地址,定位)通过半径来查询


获得指定数量的人,200


所有数据应该都录入:china:city,才会让结果更加清晰


127.0.0.1:6379> georadius china:city 110 30 1000 km 以110,30这个经纬度为中心,寻找方圆1000km内的城市

1) "chongqin"

2) "xian"

3) "shengzhen"

4) "hangzhou"

127.0.0.1:6379> georadius china:city 110 30 500 km

1) "chongqin"

2) "xian"

127.0.0.1:6379> georadius china:city 110 30 500 km withdist显示到中间距离的位置

1) 1) "chongqin"

2) "341.9374"

2) 1) "xian"

2) "483.8340"

127.0.0.1:6379> georadius china:city 110 30 500 km withcoord 显示他人的定位信息(显示城市的经纬度)

1) 1) "chongqin"

2) 1) "106.49999767541885376"

2) "29.52999957900659211"

2) 1) "xian"

2) 1) "108.96000176668167114"

2) "34.25999964418929977"

127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 1筛选出指定的结果

1) 1) "chongqin"

2) "341.9374"

3) 1) "106.49999767541885376"

2) "29.52999957900659211"

127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 2

1) 1) "chongqin"

2) "341.9374"

3) 1) "106.49999767541885376"

2) "29.52999957900659211"

2) 1) "xian"

2) "483.8340"

3) 1) "108.96000176668167114"

2) "34.25999964418929977"


georadiusbymember


# 找出位于指定位置元素周围的其他元素

127.0.0.1:6379> georadiusbymember china:city beijing 1000 km

1) "beijing"

2) "xian"

127.0.0.1:6379> georadiusbymember china:city shanghai 400 km

1) "hangzhou"

2) "shanghai"

127.0.0.1:6379>


geohash 命令 返回一个或多个位置元素 的geohash表示


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


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

127.0.0.1:6379> geohash china:city beijing chongqin

1) "wx4fbxxfke0"

2) "wm5xzrybty0"

127.0.0.1:6379>


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


127.0.0.1:6379> zrange china:city 0 -1 查看地图中全部元素

1) "chongqin"

2) "xian"

3) "shengzhen"

4) "hangzhou"

5) "shanghai"

6) "beijing"

127.0.0.1:6379> zrem china:city Beijing 移除指定元素

(integer) 1

127.0.0.1:6379> zrange china:city 0 -1

1) "chongqin"

2) "xian"

3) "shengzhen"

4) "hangzhou"

5) "shanghai"

127.0.0.1:6379>


Hyperloglog


什么是基数?


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

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

基数(不重复的元素)= 5 ,可以接受误差


简介


redis2.8.9版本就更新了Hyperloglog数据结构

Redis Hyperloglog基数统计的算法


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


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

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

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

0.81%错误率,统计UV任务,可以忽略不计的


127.0.0.1:6379> pfadd mykey1 a b c d e f g h i j 创建第一组元素mykey1

(integer) 1

127.0.0.1:6379> pfcount mykey1 统计mykey元素的基数数量

(integer) 10

127.0.0.1:6379> pfadd mykey2 i j k l v c b e o p 创建第二组元素mykey2

(integer) 1

127.0.0.1:6379> pfcount mykey2

(integer) 10

127.0.0.1:6379> pfmerge mykey3 mykey1 mykey2合并两组mykey1 mykey2 ----> mykey3 并集

OK

127.0.0.1:6379> pfcount mykey3 看并集的数量

(integer) 15

如果可以允许容错,那么一定可以使用Hyperloglog

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


Bitmap

位存储


统计用户信息,活跃,不活跃,登录,未登录,打卡,365天打卡,2个状态,都可以使用Bitmaps

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

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


三种特殊数据类型​_perl_02


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

周一:1 周二:0 周三:1 周四:1 ……

三种特殊数据类型​_perl_03



查看某一天是否打卡

三种特殊数据类型​_redis_04

统计操作,统计打卡天数

三种特殊数据类型​_perl_05



举报

相关推荐

0 条评论