目录
三种特殊类型:
Geospatial(地理位置)
Hyperloglog(基数统计)
Bitmap(位图场景)
Geospatial
简称geo,主要用于存储地理位置信息,并对内存的信息进行操作
基本方法
geoadd:添加地理位置坐标
geopos:获取地址位置坐标
geodist:计算两个位置之间的距离
georadius:根据给定的经纬度来获取指定方位内的地理位置集合
georadiusbymember:根据给定地点获取指定范围内的坐标集合
演示:
# 1、添加
127.0.0.1:6379> geoadd china:city 116.405285 39.904989 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 113.665412 34.757975 zhengzhou
(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 120.153576 30.287459 hangzhou
(integer) 1
127.0.0.1:6379> GEOADD china:city 114.085947 22.547 shenzhen
(integer) 1
# 2、查看坐标
127.0.0.1:6379> GEOPOS china:city shenzhen
1) 1) "114.08594459295272827"
2) "22.54699993773966327"
# 3、查看两个成员之间的距离
127.0.0.1:6379> GEODIST china:city beijing shenzhen
"1943024.0448"
127.0.0.1:6379> GEODIST china:city beijing zhengzhou
"621563.5619"
# 4、根据坐标查看范围内的成员
127.0.0.1:6379> GEORADIUS china:city 116.405285 39.904989 1000 km
1) "zhengzhou"
2) "beijing"
# 5、根据成员查看范围内的成员
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "zhengzhou"
2) "beijing"
GEO底层实现原理就是ZSET,可以使用ZSET的命令来操作geo!!
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "shenzhen"
2) "hangzhou"
3) "shanghai"
4) "zhengzhou"
5) "beijing"
127.0.0.1:6379> ZREM china:city beijing
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "shenzhen"
2) "hangzhou"
3) "shanghai"
4) "zhengzhou"
Hyperloglog
什么是基数:
A{1,3,5,7,8,7} B{1,3,5,7,8}
基数(不重复的数字)=5,可以接受误差
简介
-Redis Hyperloglog 基数统计的算法!!
-优点:占用的内存是固定的!2^64不同的元素的技术,只需要占用12KB的内存!
演示:
# 创建第一个数据集合
127.0.0.1:6379> PFADD mypf1 a b c d e f g h j
(integer) 1
# 创建第二个数据集合
127.0.0.1:6379> PFADD mypf2 i j z x c v b n m
(integer) 1
# 查看集合一中数据的数量
127.0.0.1:6379> PFCOUNT mypf1
(integer) 9
# 查看集合二中数据的数量
127.0.0.1:6379> PFCOUNT mypf2
(integer) 9
# 合并一和二到一种
127.0.0.1:6379> PFMERGE mypf1 mypf2
OK
# 查看集合一
127.0.0.1:6379> PFCOUNT mypf1
(integer) 15
场景
网站的UV(一个人访问网站多次,但是还是算作一个人)
传统的方式,set用户的id,然后就可以统一set中元素数量作为判断标准!
这种方式大量存储用户的id,比较麻烦!我们的目的是为了计数!
这种方式有0.81%的错误错误率,如果是UV的话,可以忽略不计!!
Bitmap
测试
用bitmap来统计用户一周的打卡!使用0(未打卡)、1(打卡)来进行统计!
# 记录周一到周日的状态
127.0.0.1:6379> SETBIT sign 0 0
(integer) 0
127.0.0.1:6379> SETBIT sign 1 1
(integer) 0
127.0.0.1:6379> SETBIT sign 2 0
(integer) 0
127.0.0.1:6379> SETBIT sign 3 0
(integer) 0
127.0.0.1:6379> SETBIT sign 4 1
(integer) 0
127.0.0.1:6379> SETBIT sign 5 1
(integer) 0
127.0.0.1:6379> SETBIT sign 6 1
(integer) 0
#查看具体日期打卡情况
127.0.0.1:6379> GETBIT sign 1
(integer) 1
# 统计数量
127.0.0.1:6379> BITCOUNT sign
(integer) 4
场景
统计用户信息,活跃、不活跃!登录、未登录!打卡、未打卡!两个状态,都可以使用bitmap