reids在3.2版本就推出了地理位置
这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人!
相关命令:
添加数据 规则:两级无法直接添加 可以通过java程序一次性导入
该命令采用标准格式 x,y 的参数,因此必须在纬度之前指定经度。可以索引的坐标存在限制:非常靠近极点的区域不可索引。
EPSG:900913 / EPSG:3785 / OSGEO:41001规定的确切限制如下:
- 有效经度为 -180 到 180 度。
- 有效纬度为 -85.05112878 到 85.05112878 度
参数 k v(经度、纬度、名称)
所有数据应该录入china:city中 这里只写了几个测试
127.0.0.1:6379[1]> geoadd china:city 116.332906 39.892695 beijing
(integer) 1
127.0.0.1:6379[1]> geoadd china:city 116.417403 39.973343 shanghai
(integer) 1
127.0.0.1:6379[1]> geoadd china:city 116.413384 39.910925 chongqing
(integer) 1
127.0.0.1:6379[1]> geoadd china:city 120.215512 30.253083 hangzhou 116.413384 39.910925 shenzhen
(integer) 2
127.0.0.1:6379[1]> geoadd china:city 110.298337 25.283803 guilin 116.413384 39.910925 luoyang
获取值
127.0.0.1:6379[1]> geopos china:city beijing
1) 1) "116.33290618658066"
2) "39.892695025289704"
127.0.0.1:6379[1]> geopos china:city shanghai chongqing
1) 1) "116.4174011349678"
2) "39.973342248416394"
2) 1) "116.41338318586349"
2) "39.910924739867674"
127.0.0.1:6379[1]>
geodist
获取两个位置间的距离 单位:
m表厅单位为米。
km表示单位为千米。
mi表厅单位为英里.
ft表小单位为英尺。
127.0.0.1:6379[1]> geodist china:city beijing shanghai
"11506.2839"
127.0.0.1:6379[1]> geodist china:city beijing shanghai km
附近的人 通过半径来查询
georadius以给定的经纬度为中心,找出某一半径内的元素
110 30 为模拟的经纬度
127.0.0.1:6379[1]> georadius china:city 110 30 1000 km
1) "guilin"
2) "hangzhou"
127.0.0.1:6379[1]>
查看距离1000km内的城市距离 单位km
127.0.0.1:6379[1]> georadius china:city 110 30 1000 km withdist
1) 1) "guilin"
2) "525.3874"
2) 1) "hangzhou"
2) "982.8229"
查看附近1000km 城市的经纬度
127.0.0.1:6379[1]> georadius china:city 110 30 1000 km withcoord
1) 1) "guilin"
2) 1) "110.29833823442459"
2) "25.283801741506913"
2) 1) "hangzhou"
2) 1) "120.21551102399826"
2) "30.253082018852375"
127.0.0.1:6379[1]>
限制查出来的个数
127.0.0.1:6379[1]> georadius china:city 110 30 1000 km withdist withcoord count 1
1) 1) "guilin"
2) "525.3874"
3) 1) "110.29833823442459"
2) "25.283801741506913"
127.0.0.1:6379[1]>
Redis GEORADIUSBYMEMBER命令-找出位于指定范围内的元素,中心点是由给定的位置元素决定
找出位于指定元素周围的其他元素
127.0.0.1:6379[1]> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "chongqing"
3) "luoyang"
4) "shenzhen"
5) "shanghai"
127.0.0.1:6379[1]> georadiusbymember china:city shanghai 1000 km
1) "beijing"
2) "chongqing"
3) "luoyang"
4) "shenzhen"
5) "shanghai"
127.0.0.1:6379[1]>
GEOHASH命令-返回一个或多个位置元素的Geohash表示
该命令将返回11个字符的Geohash字符串
将二维的经纬度转成一维的字符串,如果两个字符串越接近,则距离越近
127.0.0.1:6379[1]> geohash china:city beijing shanghai
1) "wx4dznppc10"
2) "wx4g3hutd50"
127.0.0.1:6379[1]>
注: 没有 GEODEL 命令,因为您可以使用 ZREM 移除元素。地理索引结构只是一个排序集geo底层的实现原理就是zset我们可以通过zset命令操作geo
127.0.0.1:6379[1]> zrange china:city 0 -1
1) "guilin"
2) "hangzhou"
3) "beijing"
4) "chongqing"
5) "luoyang"
6) "shenzhen"
7) "shanghai"
127.0.0.1:6379[1]> zrem china:city shanghai
(integer) 1
127.0.0.1:6379[1]> zrange china:city 0 -1
1) "guilin"
2) "hangzhou"
3) "beijing"
4) "chongqing"
5) "luoyang"
6) "shenzhen"
127.0.0.1:6379[1]>
2.Hyperloglog
redis 2.8.9版本就更新了Hyperloglog数据结构 容错率0.81%
redis Hyperloglog基数统计算法
优点:占用的内存是固定,2^64不同的元素的技术,只需要12KB内存!如果要从内存角度来比较的话Hyperloglog首选
网页的UV(一个人访问一个网站多次,但是还算作一个人)
传统方式,set保存用户id,然后就可以统计set中的元素数量作为标准判断
这个方式如果保存大量的用户id就会比较麻烦,我们的目的是为了计数而不是保存拥护id
测试
创建第一组元素mykey1
127.0.0.1:6379[1]> pfadd mykey1 a b c d e f i j k
(integer) 1
统计 mykey1 元素基数数量
127.0.0.1:6379[1]> pfcount mykey1
(integer) 9
127.0.0.1:6379[1]> pfadd mykey2 a f r t y u i
(integer) 1
创建第二组元素mykey2
127.0.0.1:6379[1]> pfcount mykey2
(integer) 7
合并mykey1 与mykey2 到mykey3
127.0.0.1:6379[1]> pfmerge mykey3 mykey1 mykey2
OK
查看并集的数量
127.0.0.1:6379[1]> pfcount mykey3
(integer) 13
如果允许容错则可以使用 Hyperloglog,如果不允许容错,就使用set或者自己的数据类型即可
3.Bitmaps
Bitmaps位图,数据结构,都是操作二进制来进行记录的,就只有0,1两种状态
比如抛硬币 正反面 0代表正面,1代表反面(立着不算)
统计用户信息,活跃于不活跃,登录未登录等两个状态的都可以使用Bitmaps
使用bitmap来记录抛7次硬币正反面
127.0.0.1:6379[1]> setbit sign 0 1
(integer) 0
127.0.0.1:6379[1]> setbit sign 1 0
(integer) 0
127.0.0.1:6379[1]> setbit sign 2 0
(integer) 0
127.0.0.1:6379[1]> setbit sign 3 1
(integer) 0
127.0.0.1:6379[1]> setbit sign 4 1
(integer) 0
127.0.0.1:6379[1]> setbit sign 5 0
(integer) 0
127.0.0.1:6379[1]> setbit sign 6 0
(integer) 0
127.0.0.1:6379[1]>
查看某一次硬币是正面还是反面
127.0.0.1:6379[1]> getbit sign 1
(integer) 0
127.0.0.1:6379[1]> getbit sign 0
(integer) 1
统计正面反面的次数 (0为正面1为反面)
127.0.0.1:6379[1]> bitcount sign
(integer) 3