geospatial这个单词的意思是地理空间。geospatial类型可以用来搜索附近的人,也可以用来判断两地之间的直线距离等;
这个网站可以查询一些城市的经纬度数据:https://jingweidu.bmcx.com/,如下图:
getadd添加地理位置的时候有一个规则:两级是无法直接添加的,我们一般会下载城市数据,直接通过java程序一次性导入!
有效的经度从-180度到180度,有效的纬度从-85.05112878度到85.05112878度。
geoadd命令可以添加地理位置的经纬度,命令是:
geoadd geospatial类型的键的名字 某个城市的经度 某个城市的纬度 这个城市的名字 [可一次性添加多个城市的经纬度],此命令的使用如下图:
geopos geospatial类型对应的键的名字 geospatial类型所对应的键里面的成员 [可以一次性写多个成员],这个命令的的作用是可以返回指定成员的经纬度坐标,命令使用如下图:
geodist geospatial类型对应的键的名字 里面的成员1 里面的成员2,这条命令可以输出两个城市之间的直线距离,命令的使用如下图:
georadius geospatial类型对应的键的名字 经纬度表示的中心点 半径距离 距离单位 [withdist] [withcoord] [count 每次限定个数],此命令可以搜索附近的城市,搜索到城市的前提是这个城市必须要存在于china:city这个集合中,其中有几个可选项,这里解释一下:
[count 每次限定个数]这个可选项可以限定每次输出的附近的城市的个数,
[withdist]这个可选项可以输出中心点离附近的城市的距离,
[withcoord]这个可选项可以输出附近的城市的经纬度,
命令的使用如下图:
查询附近的城市的时候,如果一次查询全部那就太多了,你可以限定查询的个数,如果限定1个,那么每次就只能查询一个,如果限定2个,那么每次就只能查询两个,如下图:
还可以加上附近的城市的经纬度和中心点到附近的城市的距离,如下图:
georadiusbymember geospatial类型对应的键的名字 集合里面的成员 距离 单位 [withdist] [withcoord] [count 限定个数],此命令和georadius这个命令的使用效果相同,只不过是把中心点的经纬度坐标换成了集合里面的成员,如下图:
geohash geospatial类型对应的键的名字 集合里面的成员1 [成员2…],此命令可以将城市二维的经纬度转换成是一维的11位的hash字符串,此命令的使用如下图:
geospatial类型是基于ZSet有序集合封装的,因此我们可以对geospatial类型使用ZSet有序集合的命令,如下图:
什么是基数?
基数就是集合中不重复的元素的个数,比如A={“hhh”,“hhh”,“jjj”},B={“hhh”,“fff”,“qqq”},其中A集合的基数就是2,B集合的基数就是3。
Redis中的Hyperloglog类型是用来做基数统计的算法。
应用场景:网页的UV(一个人访问一个网站多次,但是还是算作一个人)。
传统的方式是用set保存用户的id,然后就可以统计set中的元素数量作为标准判断!这个方式如果保存大量的用户id就会比较麻烦!我们的目的是为了计数而不是为了保存用户id,所以我们可以用Hyperloglog类型来计算。
Hyperloglog类型的优点:占用的内存是固定的,2^64不同的元素只需要废掉12KB的内存。如果要从内存角度比较的话Hyperloglog就是首选。但是用Hyperloglog计算基数大概有0.81%的错误率!但是这个错误率在统计UV的时候可以忽略不计!如果不允许容错,那么统计计数的时候要用Set集合不能用Hyperloglog类型。
PFadd Hyperloglog类型的名字 需要统计的元素:此命令可以把需要统计的元素加入到Hyperloglog类型对应的集合中
PFcount Hyperloglog类型的名字:此命令可以统计Hyperloglog类型所对应的集合中的元素的基数
PFmerge Hyperloglog类型的名字 Hyperloglog类型的名字2 Hyperloglog类型的名字3 [4 5…]:此命令可以把多个Hyperloglog类型中的元素合并到一个Hyperloglog类型中,注意合并之后,提供元素的Hyperloglog类型并不发生改变
这三个命令的使用如下图:
bitmap,位图,即是使用bit。 redis字符串是一个字节序列。
1 Byte = 8 bit
位存储
统计用户信息,活跃的和不活跃的,登录的和未登录的,打卡和未打卡的。像这样只有两个状态的,都可以使用Bitmaps类型。
Bitmaps位图,也是一种数据结构,都是操作二进制位来进行记录,就只有0和1两个状态!
365天=365bit 1字节=8bit
统计操作,统计打卡的天数。
如下图:
setbit Bitmaps类型的名字 offset偏移量 编码值即0或者1:此命令用来设置某一天对应的offset偏移量所对应的编码值,像比如星期一打卡了那么就把第0个偏移量的编码设置成1,星期二没打卡那么就把第1个偏移量的编码设置成0
getbit Bitmaps类型的名字 offset偏移量:此命令可以得到某个偏移量的编码值,像得到星期一的打卡情况
bitcount Bitmaps类型的名字:此命令可以获取Bitmaps类型对应的位图当中偏移量是1的个数
下面通过一周内的打卡情况来解释上面三个命令的使用情况,如下图: