Redis三种特殊的数据类型

1、Geospatial(地理位置)

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

有效的经纬度

  • 有效的经度:-180°~180°
  • 有效的纬度:-85.05112878°~85.05112878°

命令

描述

示例

GEOADD key longitud(经度) latitude(纬度) member [..]

将具体经纬度的坐标存入一个有序的集合

RedisGeo根据经纬度查询距离并排序 redis 经纬度_database

GEOPOS key member [member..]

获取集合中的一个/多个成员坐标

RedisGeo根据经纬度查询距离并排序 redis 经纬度_数据库_02

GEODIST key member1 member2 [unit]

返回两个给定位置之间的距离。默认以米做单位也可以手动添加unit(如下),指定单位

RedisGeo根据经纬度查询距离并排序 redis 经纬度_字符串_03

GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

以给定经纬度为中心,返回集合当中包含的位置元素中,返回不超过给定的最大距离的所有位置的元素

RedisGeo根据经纬度查询距离并排序 redis 经纬度_数据库_04

GEORADIUSBYMEMBER key member radius unit

以给定的已有成员作为中心位置,返回不超过给定的最大距离的所有位置的元素

RedisGeo根据经纬度查询距离并排序 redis 经纬度_database_05

GEOHASH key member1 [member2..]

返回一个或者多个位置元素用Geohash表示,使用Geohash位置52点整数编码

RedisGeo根据经纬度查询距离并排序 redis 经纬度_字符串_06

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

  • m表示单位为米(默认)
  • km表示单位为千米
  • mi表示单位为英里
  • ft表示单位为英尺

关于GEORADIUS的参数

通过georadius可以完成附近的人功能
WITHCOORD:带上坐标显示
WITHDIST:带上距离显示,单位与半径单位是相同的
WITHHASH:返回指定结果中包含的geopath
COUNT count:指定返回结果的数量,只显示前面count个(默认按照距离递增排序)
asc|desc:返回结果根据离中心节点位置的距离进行升序或降序
store key:将返回结果的地理位置信息保存到指定key
storedist key:将返回结果离中心节点的距离保存到指定key

2、Hyperloglog(基数统计)

什么是基数?

数据集中不重复的元素的个数

Redis HyperLogLog是用来做基数统计的算法
HyperLogLog的优点:在输入元素的数量或者体积非常非常大的时候,计算技术所需要的空间是固定的,并且很小,只需要花费12KB的内存就可以计算接近2^64个不同元素的基数
HyperLogLog的缺点:HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
HyperLogLog的底层使用的是String类型

命令

描述

示例

PFADD key element1 [element2..]

添加指定元素到HyperLogLog中

RedisGeo根据经纬度查询距离并排序 redis 经纬度_database_07

PFCOUNT key [key]

返回给定HyperLogLog的基数估算值

RedisGeo根据经纬度查询距离并排序 redis 经纬度_返回结果_08

PFMERGE destkey sourceky1 [sourcekey2..]

将多个HyperLogLog合并为一个HyperLogLog

RedisGeo根据经纬度查询距离并排序 redis 经纬度_数据库_09

如果允许容错(即存在一点误差),则一定可以使用HyperLogLog(标准误差为0.81%)
如果不允许有容错,就使用Set或者自己的数据类型即可

应用场景

  • 页面的访问量(UV):一个用户多次访问,也只能算作一个热。

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

3、BitMaps(位图)

1.使用位存储,信息状态只有0和1
2.Bitmap是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。(PS:划重点 节省存储空间)
3.Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND、OR、XOR、NOT以及其他操作
4. 如果要统计全年打卡情况365天=365bit 1字节=8bit 46个字节左右!

命令

描述

示例

SETBIT key offset value

为指定key的offset位设置值(设置key的第offset位为value)

RedisGeo根据经纬度查询距离并排序 redis 经纬度_字符串_10

GETBIT key offset

获取offset位的值

RedisGeo根据经纬度查询距离并排序 redis 经纬度_数据库_11

BITCOUNT key [start end]

统计字符串被设置位1的bit数量,也可以按字节组指定统计范围

RedisGeo根据经纬度查询距离并排序 redis 经纬度_redis_12

BITOP operration destkey key [key..]

对一个或多个保存二进制的字符串key进行位元操作,并将结果保存到destkeyy上

RedisGeo根据经纬度查询距离并排序 redis 经纬度_字符串_13

BITOPS key bit [start] [end]

返回字符串里面第一个被设置为1或者0的bit位。start和end只能按字节,不能按位

RedisGeo根据经纬度查询距离并排序 redis 经纬度_返回结果_14

127.0.0.1:6379> SETBIT sign 0 1 //10000000
(integer) 0
127.0.0.1:6379> SETBIT sign 3 1 //10010000
(integer) 0
127.0.0.1:6379> BITCOUNT sign 0 3 //统计下标0,3字节组中bit为1的个数,但目前字节组sign为[10010000 00000000 00000000]只有索引为0的字节组存在为1的位
(integer) 2

operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种:

  • BITOP AND destkey key [key …] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。
  • BITOP OR destkey key [key …] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。
  • BITOP XOR destkey key [key …] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。
  • BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey 。
    注:除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。

应用场景

  • 签到统计
  • 状态统计

例如:使用bitmap来记录周一到周日的打卡记录

RedisGeo根据经纬度查询距离并排序 redis 经纬度_database_15


周一:1 周二:0 周三:0 周四:1……

RedisGeo根据经纬度查询距离并排序 redis 经纬度_database_16