Redis的三种特殊数据类型

目录

Geospatial 地理位置

geoadd(添加地理位置)

geopos(获取当前位置)

geodist(两地之间的距离)

georadius(根据指定经纬度,找出某一半径内的元素)

georadiusbymember(找出指定元素周围的其他元素)

geohash(返回一个或多个位置元素的geohash表示)

使用zset操作geo

Hyperloglog 基数统计

bitmap 位存储


 

Geospatial 地理位置

 

 Redis的Geo功能可以推算地理位置信息,两地之间的距离,附近的人。Geo有六个命令

 

geoadd(添加地理位置)

南极和北极无法直接添加,我们一般会下载城市数据,通过java程序一次性导入! 

# 有效的经度从-180度到180度。
# 有效的纬度从-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
# 127.0.0.1:6379> geoadd china:city 39.90 116.40 beijin
geoadd china:city 116.40 39.90 beijing
geoadd china:city 121.47 31.23 shanghai
geoadd china:city 106.50 29.53 chongqi 114.05 22.52 shenzhen
geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian

 

geopos(获取当前位置)

127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
127.0.0.1:6379> 

 

geodist(两地之间的距离)

m代表米、km代表千米、mi代表英里、ft代表英尺

127.0.0.1:6379> geodist china:city beijing hangzhou km
"1127.3378"
127.0.0.1:6379> 

 

georadius(根据指定经纬度,找出某一半径内的元素)

以110经度,30维度为中心寻找方圆1000km内的城市

127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqi"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> 

显示到中心距离的位置

127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "chongqi"
   2) "341.9374"
2) 1) "xian"
   2) "483.8340"
127.0.0.1:6379> 

显示它人的定位信息

127.0.0.1:6379> georadius china:city 110 30 500 km withcoord
1) 1) "chongqi"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6379> 

筛选出指定的1条结果

127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 1
1) 1) "chongqi"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
127.0.0.1:6379> 

 

georadiusbymember(找出指定元素周围的其他元素)

127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"

 

geohash(返回一个或多个位置元素的geohash表示)

127.0.0.1:6379> geohash china:city beijing hangzhou
1) "wx4fbxxfke0"
2) "wtmkn31bfb0"
127.0.0.1:6379> 

 

使用zset操作geo

geo底层是zset,我们可以使用zset来操作geo

查询地图中所有元素

127.0.0.1:6379> zrange china:city 0 -1
1) "chongqi"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> 

使用zset删除元素 

127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqi"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
127.0.0.1:6379> 

 

 

Hyperloglog 基数统计

 

所谓基数就是不重复的元素个数,例如集合A有1,2,3元素,集合B有2,3,4元素。集合A与集合B的基数为4.

Hyperloglog的优点是占用小,可以统计大量数据。但随着数据量的增大,Hyperloglog可能会出现0.81%的错误率,如果做UV(用户访问量,同一个人只统计一次)对于这种误差可以忽略不计。如果不允许有错误,就可以使用set或者自定义数据类型统计

====================================
127.0.0.1:6379> pfadd mykey a b c d e f g h i j  #创建第一组元素mykey
(integer) 1
127.0.0.1:6379> pfcount mykey #统计mykey中元素的基数数量
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j z x c v b n m  #创建第二组元素mykey2
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 9
127.0.0.1:6379> pfmerge mykey3 mykey mykey2 合并两组为mykey3,相同元素只保留一个
OK
127.0.0.1:6379> pfcount mykey3 获取mykey3的基数
(integer) 15
127.0.0.1:6379> 
====================================

 

 

bitmap 位存储

 

bitmap这种数据结构用来操作二进制位,只有0和1两个状态。可应用于统计活跃、不活跃人数。登录、未登录人数。打卡、未打卡人数。

下面使用bitmap来记录周一到周日的打卡情况。打开为1,未打卡为0

====================================
127.0.0.1:6379> setbit sign 0 1    #周一已打卡
(integer) 0
127.0.0.1:6379> setbit sign 1 0    #周二未打卡
(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 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 6
(integer) 0
127.0.0.1:6379> bitcount sign       #统计为1的个数,即打卡的个数
(integer) 3
127.0.0.1:6379> 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值