Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量和体积非常非常大时,计算基数所需要的空间总是固定的、并且是很小很小的。
在Reids里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数,这和计算基数时,元素越多消耗内存就越多的集合形成鲜明对比。
但是,HyperLogLog只会根据输入元素来计算基数,而不会存储元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
基数:比如数据集{1,3,5,7,5,7,8},那么这个数据集的基数为{1,3,5,7,8}基数(不重复元素)为5,基数估计就是在误差可接受的范围内,快速计算基数。
pfadd
127.0.0.1:6379> pfadd progrem mysql php
(integer) 1
pfcount
127.0.0.1:6379> pfcount progrem
(integer) 4
pfmerge
127.0.0.1:6379> pfadd k1 a
(integer) 1
127.0.0.1:6379> pfadd k2 b
(integer) 1
127.0.0.1:6379> pfcount k1
(integer) 1
127.0.0.1:6379> pfmerge k3 k1 k2
OK
127.0.0.1:6379> pfcount k3
(integer) 2
Redis3.2中增加了对GEO类型的支持,GEO,Geographic,地理信息的缩写,该类型,就是元素的二维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度hash等常见操作。
geoadd
两极无法直接添加,一般会下载城市数据,直接通过java程序一次性导入。
有效的经度从-180度到180度,有效的纬度从-85.05112878度到85.05112878度
当坐标位置超出指定范围时,该命令将会返回一个错误。
已添加的数据是无法再次往里面添加的。
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing
(integer) 3
geopos
127.0.0.1:6379> geopos china:city shanghai
1) 1) "121.47000163793563843"2) "31.22999903975783553"
127.0.0.1:6379> geopos china:city shenzhen beijing
1) 1) "114.04999762773513794"2) "22.5200000879503861"
2) 1) "116.38000041246414185"2) "39.90000009167092543"
geodist
单位:m:米【默认值】
km:千米
mi:英里
ft:英尺
127.0.0.1:6379> geodist china:city beijing shanghai
"1068153.5181"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1068.1535"
georadius
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqing"
2) "shenzhen"