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
相关推荐
小园子的小菜12 分钟前
Redis 核心原理深度解析:从数据结构、IO 模型到持久化机制
数据库·redis·缓存
YUS云生25 分钟前
大模型学习·第44天:Chroma向量数据库与RAG链式组装
数据库·学习
毛驴赶鹿7 小时前
【金仓数据库征文】KES V9性能调优实战记录:从慢SQL排查到全链路优化
数据库·sql
码农阿豪8 小时前
【金仓数据库征文】Mac开发环境|SpringBoot3 + MyBatisPlus对接KES V9 Docker实战全指南
数据库·macos·docker
杨云龙UP8 小时前
MySQL 数据库常用备份工具对比:mysqldump、mydumper 与 XtraBackup
linux·运维·服务器·数据库·mysql·dba·备份恢复
ZENERGY-众壹8 小时前
500个工商业电站压垮数据库?海量光伏时序数据存储的架构取舍
数据库·架构·influxdb·光伏·光伏运维
mubei-1239 小时前
SpringDAO的用法
java·开发语言·数据库
星蓝_starblue11 小时前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
三84414 小时前
sqli-labs1-10通关笔记
数据库
BullSmall15 小时前
Another Redis Desktop Manager(ARDM)下载指南
数据库·redis·缓存