Redis04:Redis的3种特殊的数据类型

1、geospatial

主要指定的地理空间位置(纬度、经度、名称),可以推算地理位置的信息,两地之间的距离,方圆几里的人等等!

城市经纬度查询地址:http://www.jsons.cn/lngcode/

官方文档地址:https://www.redis.net.cn/order/3685.html

(1)geoadd
# 语法:geoadd 参数 key 值(经度 纬度 名称)
# 作用:将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
# 范围:有效的经度从-180度到180度。
#	   有效的纬度从-85.05112878度到85.05112878度。
#	   当坐标位置超出上述指定范围时,该命令将会返回一个错误。

(2)geopos
# 语法:geopos 参数 值(名称)
# 作用:从key里返回所有给定位置元素的位置(经度和纬度)
# 返回值:返回一个数组, 数组中的每个项都由两个元素组成: 
#		第一个元素为给定位置元素的经度, 
#		而第二个元素则为给定位置元素的纬度。
#		当给定的位置元素不存在时, 对应的数组项为空值。

(3)geodist
# 语法:geodist 参数 值(名称) 指定的单位参数
# 作用:返回两个给定位置之间的距离
# 返回值:计算出的距离会以双精度浮点数的形式被返回。 
#        如果给定的位置元素不存在, 那么命令返回空值。
# 参数:
	指定单位的参数 unit 必须是以下单位的其中一个:

	m 表示单位为米。
	km 表示单位为千米。
	mi 表示单位为英里。
	ft 表示单位为英尺。
	如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

(4)georadius
# 语法:georadius 参数 经度 纬度 半径 [WITHCOORD withdist]

	WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离
			  也一并返回。 距离的单位和用户给定的范围单位保持一致。
	WITHCOORD: 将位置元素的经度和维度也一并返回。
# 作用:以给定的经纬度为中心, 找出某一半径内的元素

(5)georadiusbymember
# 语法:# 语法:georadius 参数 值(名称) 半径 [WITHCOORD withdist]
# 作用:找出位于指定范围内的元素,中心点是由给定的位置元素决定
# 区别: 和deoradius的区别:
			deoradius:中心点是由输入的经纬度决定的
			georadiusbymember:中心点是由给定的位置元素决定的

底层原理

geo底层的实现原理其实就是Zset!所以我们也可以使用Zset命令来操作geo!

2、hyperloglog

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

HyperLogLog 的优点是:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

什么是基数呢?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

示例:网页的页面访问量(一个人访问一个网站多次,但是还是算作一个人)

传统方式:set保存用户的id,然后就可以统计set中的元素数量作为判断标准!

不足:这种方式如果保存大量的用户id,就会比价麻烦。因为我们的目的是为了计数,而不是保存用户id。

(1)pfadd
# 语法:PFADD key element [element ...]
# 作用:添加指定元素到 HyperLogLog 中

(2)pfcount
# 语法:PFCOUNT key [key ...]
# 作用:返回给定 HyperLogLog 的基数估算值

(3)pfmerge
# 语法:PFMERGE destkey sourcekey [sourcekey ...]
# 作用:将多个 HyperLogLog 合并为一个 HyperLogLog

3、Bitmaps

什么是Bitmaps?(位存储)

  • Bitmaps 并不是实际的数据类型,而是定义在String类型上的一个面向字节操作的集合。因为字符串是二进制安全的块,他们的最大长度是512M,最适合设置成2^32个不同字节。

  • bitmaps的位操作分成两类:

    • 1.固定时间的单个位操作,比如把String的某个位设置为1或者0,或者获取某个位上的值

    • 2.对于一组位的操作,对给定的bit范围内,统计设定值为1的数目(比如人口统计)。

  • bitmaps最大的优势是在存储数据时可以极大的节省空间,比如在一个项目中采用自增长的id来标识用户,就可以仅用512M的内存来记录40亿用户的信息(比如用户是否希望收到新的通知,用1和0标识)

使用场景

由于bit数组的每个位置只能存储 0 或者 1 这两个状态;所以对于实际生活中,处理两个状态的业务场景就可以考虑使用bitmaps。如用户登陆/未登录,签到/未签到,关注/未关注,打卡/未打卡等。同时bitmap还通过了相关的统计方法进行快速统计。

(1)setbit
# 语法:SETBIT key offset value
# 作用:设置或者清空key的value(字符串)在offset处的bit值,这个由value(只能是0或者1)来决定。
# 返回值:在offset处原来的bit值

示例:

比如,某个平台需要统计每天用户的活跃情况(一个用户当天登了就算是一个当天活跃用户),每天都需要新生成一个bitmaps存储当天用户的登录情况。

这里的设计是: setbit active:{date} {userId} value ;比如存储2021-08-01该平台的用户活跃情况,key=active:2021-08-01;

(2)getbit
# 语法:GETBIT key offset
# 作用:返回key对应的string在offset处的bit值。
# 返回值:在offset处的bit值

示例:

比如,查询userId=666的用户在2021-08-01是否登陆:

(3)bitcount
# 语法:BITCOUNT key [start end]
# 作用:统计字符串被设置为1的bit数。
# 返回值:被设置为 1 的位的数量

示例:

比如,统计2021-08-01该平台有多少用户活跃(登陆):

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@烟雨倾城ゝ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值