Redis三种特殊数据类型

文章目录

  • Redis三种特殊数据类型
    • Geospatial(地理位置)
    • Hyperloglog
    • Bitmaps(位存储)

Redis三种特殊数据类型

Geospatial(地理位置)

相关命令:
Redis三种特殊数据类型_第1张图片

GEOADD添加一个地理位置

# GEOADD key [NX | XX] [CH] longitude latitude member [longitudelatitude member ...]
  latitude member ...]
# GEOADD key 经度 纬度 名称 来添加地理位置 可以在这个网址搜索(https://jingweidu.bmcx.com/?_t=1557818155#google_vignette)
# 两极无法导入,一般下载城市数据直接通过java程序进行导入
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chognqing
(integer) 1
127.0.0.1:6379> geoadd china:city 112.98 28.25 changsha 111.45 27.24 shaoyang
(integer) 2
127.0.0.1:6379> geoadd china:city 113.88 22.55 shenzhen 108.93 34.23 xian
(integer) 2

GEOPOS 获取指定城市坐标

# GEOPOS key [member [member ...]]
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city beijing chognqing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "106.49999767541885376"
   2) "29.52999957900659211"

GEODIST 返回给定两个位置直接的距离

# GEODIST key member1 member2 [M | KM | FT | MI]
# 单位必须是以下类型,默认是米
  # 米、千米、英里、英尺
  
127.0.0.1:6379> GEODIST china:city beijing changsha 
"1333235.2339"
127.0.0.1:6379> GEODIST china:city beijing changsha km
"1333.2352"
127.0.0.1:6379> GEODIST china:city changsha shaoyang
"187888.9301"
127.0.0.1:6379> GEODIST china:city changsha shaoyang km
"187.8889"

GEORADIUS返回geoadd填充了地理信息的排序集成员(6.2已过期,可用geosearch或者geosearchstore替代)

# GEORADIUS key longitude latitude radius 
  [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC]
  [STORE key | STOREDIST key]
# 以上海的经纬度为中心找出半径1000km以内的城市
127.0.0.1:6379> GEORADIUS china:city 120 30 1000 km
1) "changsha"
2) "shanghai"
3) "shaoyang"
# count-限制数量
# withcoord-显示经纬度
# withdist-显示距离
# store key-将返回的地理位置信息保存到一个key
# storedist key-将返回的离目标中心的距离保存到一个key
127.0.0.1:6379> GEORADIUS china:city 120 30 1000 km withcoord withdist count 2
1) 1) "shanghai"
   2) "196.2512"
   3) 1) "121.47000163793563843"
      2) "31.22999903975783553"
2) 1) "changsha"
   2) "709.1661"
   3) 1) "112.9800000786781311"
      2) "28.25000087963665152"

GEORADIUSBYMEMBER 通过geoadd填充的成员名字搜索(6.2已过期)

#GEORADIUSBYMEMBER key member radius  [WITHCOORD]
  [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key
  | STOREDIST key]
# 以邵阳为中心 1000km半径内的城市
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shaoyang 1000 km
1) "chognqing"
2) "shaoyang"
3) "xian"
4) "shenzhen"
5) "changsha"

GEOHASH 返回一个或多个位置元素的geohash表示(11个字符的字符串)

# GEOHASH key [member [member ...]]
# 将二维的经纬度转换为一维的字符串
127.0.0.1:6379> GEOHASH china:city changsha shenzhen
1) "wt02dyv80v0"
2) "ws0br3hgk20"

GEORADIUS_RO与GEORADIUS命令相同,除了不能添加store key 以及storedist key这两个参数

#GEORADIUS_RO key longitude latitude radius 
  [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC]

GEOSEARCH扩展了GEORADIUS命令,因此除了在圆形区域内搜索外,它还支持在矩形区域内搜索(6.2以上版本)

GEOSEARCH key <FROMMEMBER member | FROMLONLAT longitude latitude>
  <BYRADIUS radius <M | KM | FT | MI> | BYBOX width height <M | KM |
  FT | MI>> [ASC | DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST]
  [WITHHASH]
  
#BYRADIUS-半径搜索
#BYBOX-矩形搜索

GEO底层的数据结构是Zset,我们可以使用Zset的相关命令来进行操作

127.0.0.1:6379> ZRANGE china:city 0 -1	#查看地图中的全部元素
1) "chognqing"
2) "shaoyang"
3) "xian"
4) "shenzhen"
5) "changsha"
6) "shanghai"
7) "beijing"
127.0.0.1:6379> ZREM china:city beijing
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chognqing"
2) "shaoyang"
3) "xian"
4) "shenzhen"
5) "changsha"
6) "shanghai"

Hyperloglog

什么是基数

HyperLogLog是一个专门为了计算集合的基数而创建的概率算法,对于一个给定的集合,HyperLogLog可以计算出这个集合的近似基数:近似基数并非集合的实际基数,它可能会比实际的基数小一点或者大一点,但是估算基数和实际基数之间的误差会处于一个合理的范围之内。

比如:

A {a,b,y,d}

B {a,c,g}

这两个集合的基数(不重复的元素)=5,可以接受误差

优点:占用的内存是固定的,2^64的不同元素的基数只需要12kb的内存

使用案例:统计网页的UV(一个人访问一个网站多次,还是算作一个人)

按照我们传统的方式,使用set保存用户的id,然后统计set中的元素个数作为标准判断,如果存入大量的用户id就会比较麻烦,作为统计UV而言,HyperLogLog带来的误差是可以忽略不计的。

127.0.0.1:6379> PFADD mykey a b c d e f g	#创建元素
(integer) 1
127.0.0.1:6379> pfcount mykey	#统计元素
(integer) 7
127.0.0.1:6379> PFADD mykey1 f g h i j k
(integer) 1
127.0.0.1:6379> PFCOUNT mykey1
(integer) 6
127.0.0.1:6379> PFMERGE mykey3 mykey mykey1	#合并元素
OK
127.0.0.1:6379> PFCOUNT mykey3
(integer) 11

如果允许容错,一定可以使用HyperLogLog,如果不允许容错,就使用set。

Bitmaps(位存储)

统计用户信息,活跃不活跃,或者登陆未登录,打卡状态,只有两个状态的都可以使用。

Redis三种特殊数据类型_第2张图片

使用bitmap来记录周一到周五的打卡

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 1
(integer) 0
127.0.0.1:6379> setbit sign 3 0
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> getbit sign 3	#查看某天是否打卡
(integer) 0

127.0.0.1:6379> BITCOUNT sign	#查看打卡天数
(integer) 3


你可能感兴趣的:(redis,数据库)