Redis另外三种特殊的类型

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值