四.Redis学习:特殊数据类型

简介

Redis除了五个基本数据类型之外,还额外提供了geospatial(地理空间geo)、bitmaps、hyperloglog三个特殊的数据类型。而且非常的有用和强大。

geo(地理空间)

geo

geo数据类型的应用,虽然可以很好的处理很多定位、位置相关运算功能。但在最坏的情况下,会出现0.5%的定位误差,一些对地理位置需求非常谨慎的应用、功能需要谨慎的考虑使用。


geoadd

geoadd key j w member … 将给定的一个或多个空间元素(经度,纬度,名字)添加到指定的键里面。这些数据会被存储到一个有序集合(sorted set)中。

  • 有效的经度范围: -180度到180度。
  • 有效的纬度范围: -85.05112878度到85.05112878度。

当坐标位置超出上述指定范围时,该命令会返回一个错误。无法重复添加名称重复的元素。

# geoadd key j w name... 添加一个或多个位置元素到geo中
SIT:0>geoadd near:man 113.22982811 22.93953934 suzy
1

SIT:0>geoadd near:man 113.1307611900 23.0017775900 liudan
1


geopos

geopos key member… 通过key和给定的一个或多个元素名称查询出对应的经纬度。
返回值是一个数组,数组的第一个元素是经度,第二个元素是纬度,如果查询的元素不存在时,给定的数据结果项是空。

# geopos key member 查询元素的经纬度
SIT:0>geopos near:man suzy
1) 113.22982639074325562
22.9395395300806868

SIT:0>geopos near:man liudan
1) 113.13076168298721313
23.00177707342709965


geodist

geodist key member1 member2 [unit] 通过给定的key,查询出两个指定元素之间的距离,设置unit距离的单位(默认m 米):

  • m 米
  • km 千米(公里)
  • mi 英里
  • ft 英尺

geodist命令在计算距离时,会假设地球为完美的球形,在极限情况下,这一假设最多会造成0.5%的误差。
返回值是一个双精度浮点数,如果给定的元素不存在,则返回空。

# geodist key member1 member2 [unti] 通过给定的key,查询出两个元素的距离,unti为单位设置,默认m米
SIT:0>geodist near:man suzy liudan
12281.6485


georadius

georadius key j w radius [m|km|mi|ft] [withdist|withcoord|withhash] [Count count] 查询半径范围的元素数据。

radius 半径的大小,可选的单位:

  • m 米
  • km 千米(公里)
  • mi 英里
  • ft 英尺

元素中的返回内容可选参数:

  • withdist 将半径内的元素名称以及与半径的距离显示出来。
  • withcoord 将半径内的元素名称显示。
  • whthhash 以52位有符号整数的形式,返回元素位置经过原始geohash编码的有序集合分支。(实际场景很少使用,主要用于测试)

查询半径内的元素数量 Count count。

使用场景:

# georadius key j w radius [withdist|withcoord|withhash] [asc|desc] [Count count] 指定经纬度查询半径范围内指定数量的元素
SIT:0>georadius near:man 113.22 22.93 2000 m withdist desc count 20
1) suzy
1462.5222
2) dameinv
1242.4315
3) dameinv1
1242.4315
4) dameinv2
1242.4315

SIT:0>georadius near:man 113.22 22.93 2000 m withcoord desc count 1
1) suzy


georadiusbymember

georadiusbymember key member radius [m|km|mi|ft] [withdist|withcoord|withhash] [Count count] 该命令的使用方法和georadius几乎一模一样,唯一不同的地方,它是以指定元素的经纬度为半径搜索位置。

使用场景:

# georadiusbymember key radius [m|km|mi|ft] [withdist|withcoord|withhash]

SIT:0>georadiusbymember near:man suzy 500 m withdist count 200
1) aa
0.0000
2) suzy
0.0000
3) dameinv
421.1846
4) dameinv1
421.1846
5) dameinv2
421.1846

geo还提供了一个指令 geohash 由于在实际使用场景中基本不会使用,所以不再描述,有兴趣请自行查阅文档。


geo扩展

geo扩展
geo类型是没有提供删除指令的,但由于geo的底层是使用zset有序集合的,所以我们可以借助zset的zrem命令移除指定元素。
移除使用:

# zrem key member 移除指定的geo元素
SIT:0>zrem near:man aa
1

SIT:0>georadiusbymember near:man suzy 500 m withdist count 200
1) suzy
0.0000
2) dameinv
421.1846
3) dameinv1
421.1846
4) dameinv2
421.1846



bitmap(位图)

bitmap

bitmap位图,准确的说,它并非是一种数据类型,其内部依然是使用字符类型,它的值只能存储0或1。存储40亿用户的单个位图信息,只需使用512MB的内存。


setbit

setbit key offset value 命令新增一个位图,设置key名称,offset 偏移量,value 0/1。

# setbit key offset value 创建一个位图,设置key和偏移量,值只能0/1
SIT:0>setbit dk:id 20200427 1
0


getbit

getbit key offset 该命令根据key指定的偏移量查询value的值。

# getbit key offset 根据key和指定的偏移量查询出value
SIT:0>getbit dk:id 20200427
1


bitcount

bitcount key [start, end] 该命令根据指定的key,查询出所有value=1的数据数量。[start,end]偏移量选填。

# bitcount key [start, end] 根据指定的key查询value=1的数量 
SIT:0>bitcount dk:id
1

SIT:0>setbit dk:id 20200426 1
0

SIT:0>bitcount dk:id
2


bitpos

bitpos key [0/1] [start,end] 该命令根据指定的key,查询第一个value=1的偏移量。(该命令用的不多,详细使用请自行查阅)

# bitpos key 1 获取第一个value=1的偏移量
SIT:0>bitpos dk:id 1
20200426


bitop

bitop op key1 [key2…] 该命令可以做多个bitmap的op操作 and(交集)、or(并集)、not(非)、xor(异域)的结果集,保存到newkey中。

# bitop op key1 [key2...] 根据op操作得到结果,并把结果保存到newkey中
SIT:0>bitop and newkey dk:id
2525054

SIT:0>bitcount dk:id
2


bitmap扩展

bitmap扩展
bitmap可以应用在统计打卡、统计登录等功能。40亿用户单位图信息数据,仅仅消耗512MB的内存。



hyperloglog(基数统计)

hyperloglog

hyperloglog的数据类型用于做基数统计算法的时候,在数据量很庞大的情况下,计算基数所需的空间特别小,而且是固定的(12KB)。

redis每个hyperloglog键只需花费固定的12KB内存,就可以计算接近2^64个不同元素的基数。

hyperloglog只会根据输入的元素计算基数,而不会存储输入的元素,所以它只需非常小的内存就可以得到基数运算结果。

hyperloglog只提供了3个方法。


pfadd

pfadd key member [member…] 该命令把指定元素添加到hyperloglog中。

# pfadd key member [member...] 把指定的一个或多个元素添加到hyperloglog中,添加成功返回1
tx-server:0>pfadd hplog mysql
1

tx-server:0>pfadd hplog dsj
1

tx-server:0>pfadd hplog ai
1

tx-server:0>pfadd hplog python
1

tx-server:0>pfadd hplog java
1


pfcount

pfcount key 查询指定key的基数个数

# pfadd 添加重复元素时,会返回0,添加失败
tx-server:0>pfadd hplog python
0

# pfcount key 查询指定key的基数个数
tx-server:0>pfcount hplog
5


pfmerge

pfmerge newkey key1 [key2…] 该命令从一个或多个hyperloglog数据中计算出基数结果,并保存到新的hyperloglog中。

# pfadd 新建一个hyperloglog
tx-server:0>pfadd hplog1 java yiyuyan python oracle
1

# pfmerge newkey key1 [key2...] 从一个或多个hyperloglog数据计算出结果,并保存到newkey
tx-server:0>pfmerge newkey hplog hplog1
OK

tx-server:0>pfcount newkey
7


hyperloglog建议
做超大数据集基数统计时,可以使用该数据算法实现。比如pv(网站请求量)统计功能的时候,就特别适合使用该类型算法实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值