将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作;
场景:朋友的定位、附近的人、打车距离计算;
Redis的Geo在Redis3.2版本就推出了;
有效的经度从-180度到180度;
有效的纬度从-85.05112878度到85.05112878度;
当坐标位置超出上述指定范围时,该命令将会返回一个错误;
我们一般会下载城市数据,用Java程序一次性导入;
geoadd key 经度 纬度 名称 # 添加一个
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing # 添加一个
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai 106.50 29.53 chongqing # 添加多个
(integer) 2
geopos key 名字
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918"
2) "39.900000091670925"
geodist key 名字1 名字2 单位(默认是米)
127.0.0.1:6379> geodist china:city beijing chongqing
"1464070.8051"
georadius key 给定的经度 给定的纬度 距离 单位
# 获取给定位置和半径内的位置信息
georadius key 给定的经度 给定的纬度 距离 单位 withcood
# 获取给定位置和半径内的位置信息,并显示他人的定位信息
georadius key 给定的经度 给定的纬度 距离 单位 withdist withcood count num
# 可使用withdist withcood count num 设置限制数量
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqing"
georadiusbymember key 名字 距离 单位
# 其他可参考——5、以给定的经度纬度为中心找出某一半径内的元素
127.0.0.1:6379> georadiusbymember china:city shanghai 1500 km
1) "chongqing"
2) "shanghai"
3) "beijing"
返回11个字符的Geohash字符串;
字符串越像,距离越近;
geohash key 名字1 名字2 。。。 以此类推即可
127.0.0.1:6379> geohash china:city beijing shanghai
1) "wx4fbxxfke0"
2) "wtw3sj5zbj0"
geo的底层实现原理是Zset,我们可以使用Zset命令来操作geo;
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "shanghai"
3) "beijing"
127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "shanghai"
集合A={1,2,3,4,5,3}的基数(一个集合中不重复的元素个数)为5;
Redis2.8.9版本更新出来了HyperLogLog数据结构;
Redis HyperLogLog基数统计算法;
举例:网站的UV(访问人数);
HyperLogLog基数统计算法优点:占用的内存是固定的2^64不同的元素,只需要消耗12k的内存;
存在0.81%的错误率(是可接受的,如果不容错误,则可以使用set或者其他);
传统的方式:使用set集合(不允许重复)保存用户的id,这种方式如果保存大量的用户id就会很麻烦;
我们的目的是计数,而不是保存用户id;
127.0.0.1:6379> pfadd key1 1 2 3 4 5 6 7 8 9
(integer) 1
127.0.0.1:6379> pfcount key1
(integer) 9
pfmerge 合并到的key 被合并的key1 被合并的key2
127.0.0.1:6379> pfadd key1 1 2 3 4 5 6 7 8 9
(integer) 1
127.0.0.1:6379> pfcount key1
(integer) 9
127.0.0.1:6379> pfadd key2 a b c d e f g
(integer) 1
127.0.0.1:6379> pfcount key2
(integer) 7
127.0.0.1:6379> pfmerge key1 key2
OK
127.0.0.1:6379> pfcount key1
(integer) 16
127.0.0.1:6379> pfcount key2
(integer) 7
127.0.0.1:6379> pfmerge key3 key1 key2
OK
127.0.0.1:6379> pfcount key3
(integer) 16
场景:统计用户信息:活跃、不活跃;登录、未登录;打卡、未打卡;两个状态的都可以使用Bitmaps;
Bitmaps位图,数据结构,都是操作二进制位来进行记录,就只有0和1两种状态;
setbit key index boolen(0或者1)
getbit key index
bitcount key [start stop]
# 不带[start stop]默认查询全部,带了反而我还没搞明白怎么回事,没懂啥意思
127.0.0.1:6379> bitcount sign
(integer) 4
[start stop]不知道怎么用;