前言
Redis有三种特殊的数据格式:GEO存储地理坐标和计算,Hyperloglog用于不重复的基数统计,Bitmap位图用于统计互斥事件。
GEO 的数据结构总共有六个命令
- geoadd
- geopos
- geodist
- georadius
- georadiusbymember
- geohash
Redis GEOADD 命令
说明
将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。
实例
在任意一个城市经纬度查询网站进行查询获取城市信息,然后我们对其进行操作:
参数:geoadd [key] [longitude(经度)] [latitude(维度)]
geoadd chinaCity 113.27 23.15 GuangZhou
GEOPOS - geo 查询命令
相当于查询geo信息
实例
参数:geopos [key]
GEODIST - 查看坐标之间的举例
距离结果参数:
- m标识单位为米
- km标识单位为千米
- mi标识单位为英里
- ft标识单位为英尺
实例
北京到广州的距离:再添加一下北京的坐标:geoadd chinaCity 116.23 40.22 BeiJing
参数:geodist [key] [hashkey(字段)] [hashkey(字段)] 单位(不要也可以,默认米)
返回结果为:"1918.8645"
查询北京到广州的直线距离:1856km 实际差不多
GEORADIUS - 查询半径中的数据
业务背景:获取我附近的人?城市?
实例
参数:geodist [key] [hashkey(字段)] [hashkey(字段)] 单位(不要也可以,默认米)
georadius chinaCity 100 30 2000 km #以经度100,纬度30 半径2000km的内的城市
georadius chinaCity 100 30 2000 km withdist #显示城市名称和到中心位置的距离
georadius chinaCity 100 30 2000 km withcoord #显示符合条件的定位
georadius chinaCity 100 30 2000 km withcoord count 1 #输出指定个数符合条件的
效果分别如下
Hyperloglog基数统计
说明
常用于人数统计,比如说多次访问网站的用户,如何统计真实的不重复的访问人数:筛选重复的id——基数统计 【不重复的元素】。
那为什么不用SET呢?因为我们的最终目的不是为了保存id而是计数。如何理解?
比如说2^64个不同id,我们只需要12kb内存,每个id存一个bool即可无需存id字符串,便可知道id是否存在。leetcode常用这种hash算法。
实例
127.0.0.1:6379> pfadd class1 a b c d e
(integer) 0
127.0.0.1:6379> pfcount class1
(integer) 5
127.0.0.1:6379> pfadd class2 f g h i j
(integer) 1
127.0.0.1:6379> pfcount class2
(integer) 5
127.0.0.1:6379> pfmerge class3 class1 class2
OK
127.0.0.1:6379> pfcount class3
(integer) 10
127.0.0.1:6379>
Bitmap
说明
Bitmap就是通过一个bit
位来表示某个元素对应的值或者状态。Bitmaps位图操作二进制进行记录,只有0和1两个状态。
比如统计vip和非vip用户,和其它的状态:审批,未审批等,以及打卡,想起了优酷的穷vip注解。。。
以打卡为例:365天中每天为一个Bit,一个字节8bit,只需要几十个字节!
setbit [key] [offset] [value]
getbit [key]
bitcount [key]
举例
😘如果对你有所帮助点个赞,给点小动力,谢谢啦~
补充
补充下zset的用法:
ZADD key score1 member1 [score2 member2]