使用场景:定位?附近的人?打车距离计算?
Redis的Geo在redis3.2版本推出了,这个功能可以推算两地之间的地理距离
查询地理位置及经纬度:http://www.jsons.cn/lngcode
getadd
#getadd 添加地理位置
#两级无法添加,我们一般不会下载城市数据,直接通过java导入
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing #geoadd <经度> <纬度>
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 104.06 30.65 chengdu
(integer) 1
127.0.0.1:6379> geoadd china:city 106.09 30.79 nanchong
(integer) 1
getpos
#getpos 获取指定城市的经度和纬度
127.0.0.1:6379> geopos china:city nanchong
1) 1) "106.09000056982040405"
2) "30.78999932842934584"
geodist
返回两个给定位置之间的距离。
如果两个位置之间的其中一个不存在, 那么命令返回空值。
指定单位的参数 unit 必须是以下单位的其中一个:
127.0.0.1:6379> geodist china:city nanchong chengdu km #查看直线距离
"194.7264"
127.0.0.1:6379> geodist china:city beijing chengdu km
"1518.4302"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"
georadus
#以设置的经纬度为圆心,radiss为半径,向周围搜索
127.0.0.1:6379> georadius china:city 105 30 500 km withdist withcoord
1) 1) "chengdu"
2) "115.6341" #withdist 为直线距离
3) 1) "104.05999749898910522" #withcoord为经纬度
2) "30.6499990746355806"
2) 1) "nanchong"
2) "136.5874"
3) 1) "106.09000056982040405"
2) "30.78999932842934584"
127.0.0.1:6379> georadius china:city 105 30 500 km withdist withcoord count 1 #用count规定个数
1) 1) "chengdu"
2) "115.6341"
3) 1) "104.05999749898910522"
2) "30.6499990746355806"
georaduisbymember
#通过key中元素来查找周围符合条件的元素
127.0.0.1:6379> georadiusbymember china:city nanchong 200 km withdist withcoord
1) 1) "chengdu"
2) "194.7264"
3) 1) "104.05999749898910522"
2) "30.6499990746355806"
2) 1) "nanchong"
2) "0.0000"
3) 1) "106.09000056982040405"
2) "30.78999932842934584"
geohash
该命令将返回11个字符的Geohash字符串
#将二维的经纬度转化为一维的哈希值
127.0.0.1:6379> geohash china:city beijing chengdu
1) "wx4fbxxfke0"
2) "wm3yrgwjjt0"
geo的底层实现是zset,所以我们可以通过zset的命令来操作geo
127.0.0.1:6379> zrange china:city 0 -1
1) "chengdu"
2) "nanchong"
3) "shanghai"
4) "beijing"
127.0.0.1:6379> zrem china:city nanchong
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chengdu"
2) "shanghai"
3) "beijing"
简介
Hyperloglog是redis基数(无重复)统计的算法
优点:占用的内存是固定的,用12kb的内存可以保存2^64不同元素的计数,从内存角度来看,hyperloglog是首选
比如说:计算网站的人数(一个客户访问一个网站多次,但还是算作一个)
传统的方式是使用set方法保存用户的id,可以统计set的元素数量来作为人数
这个方式在保存大量的用户id,就会比较麻烦!我们的目的是计数而不是保存用户id!
测试
127.0.0.1:6379> pfadd mykey a a b c d e
(integer) 1
127.0.0.1:6379> pfcount mykey #只计算集合的基数
(integer) 5
127.0.0.1:6379> pfadd mykey1 d e f g h
(integer) 1
127.0.0.1:6379> pfmerge mykey2 mykey mykey1 #求两个集合的并集并转化为一个新的集合
OK
127.0.0.1:6379> pfcount mykey2
(integer) 8
位存储
操作二进制位来进行数据记录,一般用于两种状态的记录,比如:
统计用户信息:登录,未登录;打卡,未打卡 可以用0 1来描述
测试
比如说,记录一周的打卡记录,0为未打卡,1为打卡
127.0.0.1:6379> setbit sign 0 1
(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 1
(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 0 #获取星期一的打卡状态
(integer) 1
127.0.0.1:6379> getbit sign 2 #获取周日的打卡状态
(integer) 0
统计一段时间内的打卡数
127.0.0.1:6379> bitcount sign
(integer) 6