Redis三种特殊数据类型

三种特殊基本类型

Geospatial(地理位置)

使用经纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用

命令描述
geoadd key longitud(经度) latitude(纬度) member [..]将具体经纬度的坐标存入一个有序集合
geopos key member [member..]获取集合中的一个/多个成员坐标
geodist key member1 member2 [unit]返回两个给定位置之间的距离。默认以米作为单位。
`georadius key longitude latitude radius mkm
GEORADIUSBYMEMBER key member radius...功能与GEORADIUS相同,只是中心位置不是具体的经纬度,而是使用结合中已有的成员作为中心点。
geohash key member1 [member2..]返回一个或多个位置元素的Geohash表示。使用Geohash位置52点整数编码。

有效经纬度

  • 有效的经度从-180度到180度。
  • 有效的纬度从-85.05112878度到85.05112878度。

有效单位 unit 必须是以下单位的其中一个:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

geoadd

将给定的空间元素(纬度、经度、名字)添加到指定的键里面。

  • 语法:geoadd key longitude(经度) latitude(纬度) member
  • geoadd命令以标准的x,y格式接受参数,所以用户必须先输入经度,然后再输入纬度
  • geoadd能够记录的坐标是有限的:非常接近两极的区域无法被索引
  • 当用户尝试输入一个超出有效经纬度范围时,geoadd命令将返回一个错误
  • 这些数据会以有序集合的形式被储存在键里面,从而使得georadius和georadiusbymember这样的命令可以在之后通过位置查询取得这些元素。
127.0.0.1:6379> geoadd china:city 116.23 40.22 北京
(integer) 1
127.0.0.1:6379> geoadd china:city 121.48 31.40 上海 113.88 22.55 深圳 120.21 30.20 杭州
(integer) 3
127.0.0.1:6379> geoadd china:city 106.54 29.40 重庆 108.93 34.23 西安 114.02 30.58 武汉
(integer) 3

geopos

从key里返回所有给定位置元素的位置(经度和纬度)

  • 语法:geopos key member [member...]
127.0.0.1:6379> geopos china:city 北京
1) 1) "116.23000055551528931"
2) "40.2200010338739844"
127.0.0.1:6379> geopos china:city 上海 重庆
1) 1) "121.48000091314315796"
2) "31.40000025319353938"
2) 1) "106.54000014066696167"
2) "29.39999880018641676"
127.0.0.1:6379> geopos china:city 新疆
1) (nil)

geodist

返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在,那么命令返回空值

命令:geodist key member1 member2 [unit] unit默认使用米(m)作为单位

127.0.0.1:6379> geodist china:city 北京 上海
"1088785.4302"
127.0.0.1:6379> geodist china:city 北京 上海 km
"1088.7854"
127.0.0.1:6379> geodist china:city 重庆 北京 km
"1491.6716"

georadius

以给定的经纬度为圆心, 找出指定半径内的元素

georadius key 经度 纬度 半径 单位 [withcoord][withdist][withhash][asc|desc][count count]

# 在 china:city 中寻找坐标 100 30 半径为 1000km 的城市
127.0.0.1:6379> georadius china:city 100 30 1000 km
重庆
西安
# withdist 返回位置名称和中心距离
127.0.0.1:6379> georadius china:city 100 30 1000 km withdist
重庆
635.2850
西安
963.3171
# withcoord 返回位置名称和经纬度
127.0.0.1:6379> georadius china:city 100 30 1000 km withcoord
重庆
106.54000014066696167
29.39999880018641676
西安
108.92999857664108276
34.23000121926852302
#withdist 返回位置名称 距离
#withcoord  经纬度
#count 限定寻找个数
127.0.0.1:6379> georadius china:city 100 30 1000 km withcoord withdist count
1
重庆
635.2850
106.54000014066696167
29.39999880018641676
127.0.0.1:6379> georadius china:city 100 30 1000 km withcoord withdist count

georadiusbymember

解析:

# 语法
georadiusbymember key member radius m|km|ft|mi [withcoord][withdist]
[withhash][asc|desc][count count]
# 找出位于指定范围内的元素,中心点是由给定的位置元素决定

测试:

127.0.0.1:6379> GEORADIUSBYMEMBER china:city 北京 1000 km
北京
西安
127.0.0.1:6379> GEORADIUSBYMEMBER china:city 上海 400 km
杭州
上海

geohash

Redis使用geohash将二维经纬度转换为一维字符串,字符串越长表示位置更精确,两个字符串越相似表示距离越近。

geohash key member [member...]

127.0.0.1:6379> geohash china:city 北京 重庆
wx4sucu47r0
wm5z22h53v0
127.0.0.1:6379> geohash china:city 北京 上海
wx4sucu47r0
wtw6sk5n300

zrem

GEO没有提供删除成员的命令,但是因为GEO的底层实现是zset,所以可以借用zrem命令实现对地理位 置信息的删除.

127.0.0.1:6379> geoadd china:city 116.23 40.22 beijin
1
127.0.0.1:6379> zrange china:city 0 -1 # 查看全部的元素
杭州
beijin
北京
127.0.0.1:6379> zrem china:city beijin # 移除元素
1

127.0.0.1:6379> zrange china:city 0 -1
杭州
北京

Hyperloglog(基数统计)

HyperLogLog 是用来做基数估算统计的算法,

  • 少量固定的空间统计大量的数据,花费 12 KB 内存,就可以统计接近 2^64 个不同元素的基数。
  • HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 不能像集合那样,返回输入的元素
  • 估算的基数并不一定准确,是一个带有 0.81% 标准错误的近似值(对于可以接受一定容错的业务场景,比如IP数统计,UV等,是可以忽略不计的).如果不允许容错,就使用set或者自己的数据类型
  • 其底层使用string数据类型

什么是基数?

数据集中不重复的元素

应用场景:

  • 网页的访问量(UV):一个用户多次访问,也只能算作一个人。
  • 各种数量统计,比如注册 IP 数、每日访问 IP 数、页面实时UV、在线用户数,共同好友数等。

传统实现,存储用户的id,然后每次进行比较。当用户变多之后这种方式及其浪费空间,而我们的目的只是计数,Hyperloglog就能帮助我们利用最小的空间完成。

命令描述
PFADD key element1 [elememt2..]添加指定元素到 HyperLogLog 中
PFCOUNT key [key]返回给定 HyperLogLog 的基数估算值。
PFMERGE destkey sourcekey [sourcekey..]将多个 HyperLogLog 合并为一个 HyperLogLog
----------PFADD--PFCOUNT---------------------
127.0.0.1:6379> pfadd x 1 2 3 4 5 6 # 添加元素
(integer) 1

127.0.0.1:6379> pfadd x # 估算x的基数
(integer) 6

127.0.0.1:6379>pfadd y  5 6 7 8 9 10   #添加
(integer) 1

127.0.0.1:6379> pfcount y  # 估算y的基数
(integer) 6

127.0.0.1:6379> type myelemx # hyperloglog底层使用String
string

----------------PFMERGE-----------------------
127.0.0.1:6379> pfmerge  z x y # 合并x和y 成为z
OK
127.0.0.1:6379> pfcount z # 估算基数
(integer) 10

BitMaps(位图)

Bitmap 即位图数据结构,都是操作二进制位来进行记录,只有0 和 1 两个状态。

Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR,NOT以及其它位操作。

应用场景:

  • 签到统计、状态统计

  • 比如:统计用户信息,活跃,不活跃! 登录,未登录! 打卡,不打卡! 两个状态的,都可以使用 Bitmaps

命令描述
setbit key offset value为指定key的offset位设置值
getbit key offset获取offset位的值
bitcount key [start end]统计字符串被设置为1的bit数,也可以指定统计范围按字节
bitop operration destkey key[key..]对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
BITPOS key bit [start] [end]返回字符串里面第一个被设置为1或者0的bit位。start和end只能按字节,不能按位

例如:

记录用户周一到周日的打卡情况

------------setbit--------------
#使用bitmap 来记录 周一到周日的打卡! 周一:1 周二:0 周三:0 周四:1 ......
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0

------------getbit--------------
#查看某一天是否打卡!
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 5
(integer) 0

-----------bitcount----------------------------
#统计操作,统计 打卡的天数!
127.0.0.1:6379> bitcount sign # 统计这周的打卡记录,就可以看到是否有全勤!
(integer) 3
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值