Redis三种特殊数据类型之Geospatial(地理空间)、Hyperloglog(基数)、Bitmaps(位存储)
一、Geospatial(地理空间)
中文官方文档 写的非常清楚
Geospatial(地理空间)主要应用在朋友的定位、附近的人、打车距离计算
- GEOADD 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
localhost:2>geoadd china:city 116.40 31.23 beijing
"1"
localhost:2>geoadd china:city 121.47 31.23 shanghai
"1"
localhost:2>geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shengzhen
"2"
localhost:2>geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
"2"
- GEOPOS 从key里返回所有给定位置元素的位置(经度和纬度)
localhost:2>GEOPOS china:city beijing #查看北京的经纬度
1) 1) "116.39999896287918"
2) "31.229999039757836"
localhost:2>GEOPOS china:city beijing hangzhou
1) 1) "116.39999896287918"
2) "31.229999039757836"
2) 1) "120.16000002622604"
2) "30.240000322949022"
- GEODIST 返回两个给定位置之间的距离
localhost:2>GEODIST china:city hangzhou shanghai m #获取杭州到上海的距离(米)
"166761.2770"
localhost:2>GEODIST china:city hangzhou shanghai km
"166.7613"
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
- GEORADIUS 以给定的经纬度为中心, 找出某一半径内的元素
#查询以 110E 30N为中心 半径为1000km的城市
localhost:2>GEORADIUS china:city 110 30 1000 km
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "beijing"
5) "hangzhou"
#查询以 110E 30N为中心 半径为500km的城市
localhost:2>GEORADIUS china:city 110 30 500 km
1) "chongqing"
2) "xian"
#查询以 110E 30N为中心 半径为500km的城市并获取所间隔的距离
localhost:2>GEORADIUS china:city 110 30 500 km withdist
1) 1) "chongqing"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
#查询以 110E 30N为中心 半径为500km的城市并获取城市的经纬度
localhost:2>GEORADIUS china:city 110 30 500 km withcoord
1) 1) "chongqing"
2) 1) "106.49999767541885"
2) "29.529999579006592"
2) 1) "xian"
2) 1) "108.96000176668167"
2) "34.2599996441893"
#查询以 110E 30N为中心 半径为500km的城市并获取城市的经纬度和距离 筛选指定的数量
localhost:2>GEORADIUS china:city 110 30 500 km withdist withcoord count 1
1) 1) "chongqing"
2) "341.9374"
3) 1) "106.49999767541885"
2) "29.529999579006592"
- GEORADIUSBYMEMBER 找出位于指定范围内的元素,中心点是由给定的位置元素决定
localhost:2GEORADIUSBYMEMBER china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
-
GEOHASH 返回一个或多个位置元素
该命令将返回11个字符的geohash字符串
将二维的经纬度转换为一堆的字符串,如果两个字符串越接近,那么距离越近
localhost:2>geohash china:city beijing chongqing
1) "wtdc8tpzut0"
2) "wm5xzrybty0"
GEO的底层原理其实是Zset 我们可以使用Zset命令来操作geo
localhost:2>zrange china:city 0 -1 #查看全部的元素
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "beijing"
5) "hangzhou"
6) "shanghai"
localhost:2>zrem china:city xian #去除其中指定的元素
"1"
localhost:2>zrange china:city 0 -1
1) "chongqing"
2) "shengzhen"
3) "beijing"
4) "hangzhou"
5) "shanghai"
二、Hyperloglog(基数)
Redis Hyperloglog 基数统计的算法
优点:占用的内存是固定的,2^64不同元素的基数,只需要12KB的内存。如果从内存角度来比较的话 Hyperloglog是首选
网页的UV访问量(一个人访问一个网站多次,但是还是算作一个人)
传统的方式,set保存用户的id,然后就可以统计set中的元素数量作为判断标准
这个方式如果保存大量的用户id,就会比较麻烦 我们的目的是为了计数,而不是为了保存用户id
允许0.81*%的错误率,统计UV任务时,是可以忽略不计的
localhost:2> pfadd mykey a b c d e f g h i j #创建第一组元素
"1"
localhost:2>pfcount mykey #统计mykey元素的基数数量
"10"
localhost:2>pfadd mykey2 i j z x l m n #创建第二组元素
"1"
localhost:2>pfcount mykey2
"7"
localhost:2>PFMERGE mykey3 mykey mykey2 #合并两组 mykey mykey2 --> mykey3
"OK"
localhost:2>pfcount mykey3
"15"
三、Bitmaps(位存储)
统计用户信息:活跃、不活跃! 登录、不登录!打卡记录 使用两个状态来记录的话,都可以使用Bitmaps
Bitmaps位图,数据结构,都是操作二进制来进行记录 就只有0和1两个状态
365天 = 365 bit 1字节= 8bit 46个字节左右
我是听狂神的课并进行记录。狂神说的非常好,大家快去学狂神说Java