10、Redis三种特殊的数据类型

一、Geospatail地理位置

1、Geospatail的应用

  • 朋友的位置,附近的人,打车距离

2、相关命令

1、geoadd:增加某个地理位置的坐标(可批量添加)。

语法: GEOADD key longitude latitude member [longitude latitude member ...]

127.0.0.1:6379> geoadd china:city 116.405285 39.904989 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.472644 31.231706 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 113.280637 23.125178 guangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 114.085947 22.547 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 120.153576 30.287459 hangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 108.948024 34.263161 xian
(integer) 1
127.0.0.1:6379> 

2、geopos:获取某个地理位置的坐标(可批量获取)。

语法:GEOPOS key member [member ...]

127.0.0.1:6379> geopos china:city shanghai
1) 1) "121.47264629602432251"
   1) "31.23170490709807012"
127.0.0.1:6379> geopos china:city xian chongqing
1) 1) "108.94802302122116089"
   2) "34.2631604414749944"
2) (nil)
127.0.0.1:6379> geopos china:city xian beijing  #获取多个地点的经纬度
1) 1) "108.94802302122116089"
   2) "34.2631604414749944"
2) 1) "116.40528291463851929"
   2) "39.9049884229125027"
127.0.0.1:6379> 

3、geodist:获取两个地理位置的距离。

语法:GEODIST key member1 member2 [m|km|ft|mi

#m 表示单位为米。
#km 表示单位为千米。
#mi 表示单位为英里。
#ft 表示单位为英尺。
#如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

127.0.0.1:6379> geodist china:city beijing shanghai         #获取北京到上海的距离米
"1067597.9668"
127.0.0.1:6379> geodist china:city beijing xian             #获取北京到西安的距离米
"911278.5437"
127.0.0.1:6379> geodist china:city beijing shanghai km      #北京到上海的距离km
"1067.5980"
127.0.0.1:6379> 

4、georadius:根据给定地理位置坐标获取指定范围内的地理位置集合。

语法:GEORADIUS key longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]
longitude latitude标识了地理位置的坐标,radius表示范围距离,距离单位可以为m|km|ft|mi,还有一些可选参数:

  • WITHCOORD:传入WITHCOORD参数,则返回结果会带上匹配位置的经纬度。

  • WITHDIST:传入WITHDIST参数,则返回结果会带上匹配位置与给定地理位置的距离。

  • ASC|DESC:默认结果是未排序的,传入ASC为从近到远排序,传入DESC为从远到近排序。

  • WITHHASH:传入WITHHASH参数,则返回结果会带上匹配位置的hash值。

  • COUNT count:传入COUNT参数,可以返回指定数量的结果。

127.0.0.1:6379> georadius china:city 110 30 1000 km      #以110,30这个经纬度为中心,寻找方圆1000km内的城市
1) "xian"
2) "shenzhen"
3) "guangzhou"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km      #以110,30这个经纬度为中心,寻找方圆500km内的城市
1) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist  #显示两个城市中间距离的距离
1) 1) "xian"
   2) "484.4073"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord  # 110 30 范围内城市的定位信息
1) 1) "xian"
   2) 1) "108.94802302122116089"
      2) "34.2631604414749944"
127.0.0.1:6379>

5、georadiusbymember:根据给定地理位置获取指定范围内的地理位置集合。

语法:GEORADIUSBYMEMBER key member radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]

可选参数同georadius

127.0.0.1:6379> georadiusbymember china:city beijing 1000 km        #找出以北京为中心,方圆1000km内的城市
1) "beijing"
2) "xian"
127.0.0.1:6379> georadiusbymember china:city shanghai 1000 km        #找出以上海为中心,方圆1000km
1) "hangzhou"
2) "shanghai"
127.0.0.1:6379> 

6、geohash:获取某个地理位置的geohash值。

语法:GEOHASH key member [member ...]

#将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越近!
127.0.0.1:6379> geohash china:city beijing
1) "wx4g0b7xrt0"
127.0.0.1:6379> geohash china:city xian
1) "wqj6zjmt2u0"
127.0.0.1:6379> geohash china:city shanghai
1) "wtw3sjt9vg0"
127.0.0.1:6379> 

3、GEO底层的实现原理其实就是Zset

1、zset操作Geospatail

127.0.0.1:6379> zrange china:city 0 -1              #获取所有的城市集合
1) "xian"
2) "shenzhen"
3) "guangzhou"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city hangzhou            #移除指定的城市
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1              #查看移除后剩下的城市
1) "xian"
2) "shenzhen"
3) "guangzhou"
4) "shanghai"
5) "beijing"
127.0.0.1:6379> 

测试数据网站

Redis中文网站

二、HyperLogLog

1、基数

再开始在前了解什么是基数?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

2、简介

  • Redis 2.8.9版本就更新了Hyperloglog数据结构!
  • Redis Hyperloglog基数统计的算法!
  • 网页的UV(一个人访问一个网站多次,但是还是算作一个人!
  • 传统的方式,set 保存用户的id,然后就可以统计set 中的元素数量作为标准判断!
  • 传统的方式,set保存用户的id,然后就可以统计set 中的元素数量作为标准判断!
  • 这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id ;
  • 0.81%错误率!统计UV任务,可以忽略不计的!

3、相关命令

1、Pfadd 命令 - 添加指定元素到 HyperLogLog 中。

语法:PFADD key element [element ...]

127.0.0.1:6379> pfadd mypf a b c d e f i j         #像mypf添加一组数据
(integer) 1
127.0.0.1:6379> pfadd mypf1 i j z x c v n m         #向mypf1添加一组数据
(integer) 1
127.0.0.1:6379> 

2、Pfcount 命令返回给定 HyperLogLog 的基数估算值。

语法:PFCOUNT key [key ...]

127.0.0.1:6379> pfcount mypf        #返回mypf 的基数值
(integer) 8
127.0.0.1:6379> pfcount mypf2        #返回mypf2 的基数值
(integer) 8
127.0.0.1:6379> pfcount mypf mypf2   #返回mypf与mypf2 回基数估值之和
(integer) 13
127.0.0.1:6379> 

3、Pgmerge 命令 - 将多个 HyperLogLog 合并为一个 HyperLogLog

语法:PFMERGE destkey sourcekey [sourcekey ...]

127.0.0.1:6379> pfmerge mypf3 mypf mypf2        #合并两组mypf mypf2 =>mypf3并集
OK
127.0.0.1:6379> pfcount mypf3                   #计算mypf3的基数值
(integer) 13
127.0.0.1:6379> 

三、Bitmaps

1、简介

(1)Bitmaps本身不是一种数据类型, 实际上它就是字符串(key-value),但是它可以对字符串的位进行操作。

(2)Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。

2、常用命令

1、setbit-设置Bitmaps中某个偏移量的值(0或1)

语法:setbit key offset value

127.0.0.1:6379> setbit singn 0 0
(integer) 0
127.0.0.1:6379> setbit singn 2 1
(integer) 0
127.0.0.1:6379> setbit singn 3 0
(integer) 0
127.0.0.1:6379> 

2、getbit-获取Bitmaps中某个偏移量的值

语法:getbit key offset

127.0.0.1:6379> getbit singn 3
(integer) 0
127.0.0.1:6379> getbit singn 2
(integer) 1
127.0.0.1:6379> 

3、bitcount-统计字符串从start字节到end字节比特值为1的数量

语法:bitcount key start end

127.0.0.1:6379> setbit unique:users:2016-04-05 0 1
(integer) 0
127.0.0.1:6379> setbit unique:users:2016-04-05 5 1
(integer) 0
127.0.0.1:6379> setbit unique:users:2016-04-05 11 1
(integer) 0
127.0.0.1:6379> setbit unique:users:2016-04-05 15 1
(integer) 0
127.0.0.1:6379> setbit unique:users:2016-04-05 19 1
(integer) 0
127.0.0.1:6379> getbit unique:users:2016-04-05 8
(integer) 0
127.0.0.1:6379> getbit unique:users:2016-04-05 8
(integer) 0
127.0.0.1:6379> bitcount unique:users:2016-04-05
(integer) 5
127.0.0.1:6379>  bitcount unique:users:2016-04-05 10 20
(integer) 0
127.0.0.1:6379>  bitcount unique:users:2016-04-05 1 3
(integer) 3
127.0.0.1:6379>
posted @ 2021-11-17 15:12  不起眼的程序员  阅读(70)  评论(0编辑  收藏  举报