Redis基础—4、Geospatial、HyperLogLog、Bitmaps
一、Geospatial
1、简介
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。
Redis GEO 操作方法有:
- geoadd:添加地理位置的坐标。
- geopos:获取地理位置的坐标。
- geodist:计算两个位置之间的距离。
- georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
- georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
- geohash:返回一个或多个位置对象的 geohash 值。
2、命令
127.0.0.1:6379> GEOADD school 116.32 39.84 CUEB #往schoolset中添加经度为116.32 维度为39.84 名为CUEB的元素
(integer) 1
127.0.0.1:6379> GEOADD school 121.5 31.31 SUFE
(integer) 1
127.0.0.1:6379> GEOADD school 104.1 30.6 SCU
(integer) 1
127.0.0.1:6379> GEOADD school 126.6 45.7 HIT
(integer) 1
127.0.0.1:6379> GEOPOS school CUEB HIT #查看CUEB和HIT的坐标
1) 1) "116.31999939680099487"
2) "39.84000070710821007"
2) 1) "126.59999996423721313"
2) "45.69999974289349609"
127.0.0.1:6379> GEODIST school CUEB SUFE km #查看CUEB和SUFE的直线距离
"1057.6707"
127.0.0.1:6379> GEORADIUS school 120 30 300 km withcoord
#查看school中以经纬度为120,30为中心,半径300KM的圆中所包含的元素,输出时带坐标输出
1) 1) "SUFE"
2) 1) "121.49999946355819702"
2) "31.30999990898889251"
127.0.0.1:6379> GEORADIUS school 120 30 300 km withdist #输出时带坐标与该元素的直线距离输出
1) 1) "SUFE"
2) "204.5174"
127.0.0.1:6379> GEORADIUS school 120 30 3000 km withdist count 2 #只输出count(2)个元素
1) 1) "SUFE"
2) "204.5174"
2) 1) "CUEB"
2) "1144.4654"
127.0.0.1:6379> GEORADIUSBYMEMBER school SCU 1800 km WITHDIST #输出距离SCU1800KM的学校
1) 1) "SCU"
2) "0.0000"
2) 1) "SUFE"
2) "1659.8496"
3) 1) "CUEB"
2) "1510.2754"
127.0.0.1:6379> geohash school CUEB SCU #输出CUEB以及SCU的hash值
1) "wx4dwutsu60"
2) "wm6n0fe3cv0"
起实GEO类型的底层是以ZSET实现的,zset的一些方法依然适用于zrange
127.0.0.1:6379> zrange school 0 -1 withscores #输出school所有元素与得分
1) "SCU"
2) "4026136830632185"
3) "SUFE"
4) "4054803861194695"
5) "CUEB"
6) "4069146299177035"
7) "HIT"
8) "4267775922676216"
二、HyperLogLog
一、简介
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
实际应用场景:
就比如说我们要记录网站的访问人数,相同用户重复访问不计入,使用set存入用户信息比较费内存,HyperLogLog比较舒服一点。
基数是啥?
就是一个数据集中将所有元素只取一次的子集合。
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。
常用方法:
方法很少。
127.0.0.1:6379> pfadd num 1 2 3 4 5 6 7 #往num中添加1,2,3,4,5,6,7这几个数
(integer) 1
127.0.0.1:6379> pfcount num #查看num里基数集合的元素个数
(integer) 7
127.0.0.1:6379> pfadd num2 1 2 3 4 5 6 7 8 9
(integer) 1
127.0.0.1:6379> pfmerge num 3 num num2 #合并num 和num2 新的集合叫num 3
OK
127.0.0.1:6379> pfcount num 3 #查看基数
(integer) 9
三、Bitmaps
一、简介
位存储
值只有0和1 比较适合存储只有两种状态的信息
统计疫情感染人数:0 1 0 1,统计用户信息,活跃,不活跃,打开,365打卡,两个状态的,都可以使用bitmaps来存储
bitmap 位图,也是一种数据结构!都是操作二进制位来进行记录,都只有 0 1两种状态
1字节 = 8bit, 也就是8个0,1的数字
127.0.0.1:6379> setbit student 0 1 #设置偏移量为0(第一位)为1
(integer) 0
127.0.0.1:6379> setbit student 1 1
(integer) 0
127.0.0.1:6379> setbit student 2 1
(integer) 0
127.0.0.1:6379> setbit student 3 0
(integer) 0
127.0.0.1:6379> getbit student 0 #获取第0位的信息
(integer) 1
127.0.0.1:6379> getbit student 1
(integer) 1
127.0.0.1:6379> getbit student 2
(integer) 1
127.0.0.1:6379> getbit student 3
(integer) 0
127.0.0.1:6379> setbit student 11 1 #设置第11位的信息为1,这里属于第二字节的信息
(integer) 0
127.0.0.1:6379> bitcount student #查看student中count为1的数目
(integer) 5
127.0.0.1:6379> bitcount student 0 0 #查看student在偏移量从0到0的count为1的数目(第一字节)
(integer) 4