Redis三种特殊数据类型

文章目录

Redis三种特殊数据类型

Geospatial(地理位置)

相关命令:

GEOADD添加一个地理位置

shell 复制代码
# 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 获取指定城市坐标

shell 复制代码
# 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 返回给定两个位置直接的距离

shell 复制代码
# 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替代)

shell 复制代码
# GEORADIUS key longitude latitude radius <M | KM | FT | MI>
  [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已过期)

shell 复制代码
#GEORADIUSBYMEMBER key member radius <M | KM | FT | MI> [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个字符的字符串)

shell 复制代码
# 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这两个参数

shell 复制代码
#GEORADIUS_RO key longitude latitude radius <M | KM | FT | MI>
  [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC]

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

shell 复制代码
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的相关命令来进行操作

shell 复制代码
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带来的误差是可以忽略不计的。

shell 复制代码
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(位存储)

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

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

shell 复制代码
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
相关推荐
白初&1 小时前
CVE-2015-3934 Fiyo CMS SQL注入
数据库·sql
IT邦德1 小时前
MySQL企业版免费开启,强先体验
数据库·mysql
艺杯羹1 小时前
数据库连接池技术与 Druid 连接工具类实现
java·数据库·mysql·jdbc
我爱Jack1 小时前
Mybatis操作数据库(2)
java·数据库·mybatis
小袁拒绝摆烂1 小时前
MySQL进阶篇-InnoDB引擎(超细)
数据库·mysql
伤不起bb1 小时前
MySQL 故障排查与生产环境优化
数据库·mysql
独行soc2 小时前
2025年渗透测试面试题总结-安恒[实习]安全服务工程师(题目+回答)
linux·数据库·安全·web安全·面试·职场和发展·渗透测试
Violet_Stray2 小时前
mac下载、使用mysql
数据库·mysql·macos
liweiweili1262 小时前
解决 MySQL 错误 1356 (HY000)
数据库·mysql
杨凯凡3 小时前
MySQL函数触发:函数处理与触发器自动化应用
数据库·mysql