Redis学习02——特殊数据类型

1. Geospatial 地理位置类型

1.1 赋值命令

使用 geoadd 命令来添加一个地理位置,添加的形式如下
geoadd key longitude1 latitude1 member1 longitude2 latitude2 member2 ...

有效的经度介于 -180 ~ 180 度之间,有效的纬度介于 -85.05112878 ~ 85.05112878 度之间。当输入超出范围的经度或者纬度,geoadd 将返回一个错误。

比如添加的坐标如下
geoadd china:city 121.48 31.40 shanghai 113.88 22.55 shenzhen 120.21 30.20 hangzhou

1.2 取值命令

  • geopos
    geopos china:city beijing hangzhou ,从 key 里返回所有给定位置元素的位置
  • geodist
    一般的形式为 geodist key member1 member2 [unit],示例比如
    geodist china:city shanghai shenzhen km,计算两地的距离,单位是km。
    其中单位必须是m km mi ft 中的一个,m 表示单位为米,km 表示单位为千米,mi 表示单位为英里,ft 表示单位为英尺。
    geodist 在计算距离时会假设地球为完美的球形,在极限情况下,这一假设最大会造成 0.5% 的误差。
  • georadius
    以给定的经纬度为中心,找出某一半径内的元素。
    通常的格式如下
    georadius key longitude latitude radius [unit] [withcoord][withdist][withhash][asc|desc][count count]
    比如在 china:city 中寻找经度100,纬度30 半径为 1000km 的城市,代码如下
    georadius china:city 100 30 1000 km
    接下来解释下除单位外的可选参数。
    withdist 返回位置名称和中心距离
    withcoord 返回位置名称和经纬度
    count 限定寻找个数
    这几个参数可叠加使用。
  • georadiusbymember
    该命令可以寻找位于指定范围内的元素,中心点是由给定的位置元素决定。
    一般的格式如下
    georadiusbymember key member radius m|km|ft|mi [withcoord][withdist][withhash][asc|desc][count count]
    示例如下:
    georadiusbymember china:city 北京 1000 km
  • geohash
    将二维经纬度转换为一维字符串,字符串越长表示位置更精确,两个字符串越相似表示距离越近。
    一般形式如下
    geohash key member [member...]
    示例如下:
    geohash china:city shanghai
  • zrange
    可以查看所有的元素。
    zrange china:city 0 -1

1.3 删除命令

GEO 没有提供删除成员的命令,但是因为 GEO 的底层实现是 zset,所以可以借用 zrem 命令实现对地理位置信息的删除。
zrem china:city shanghai 可以将 shanghai 这个元素进行移除。

2. HyperLogLog 基数统计类型

比如数据集 { 1 , 3 , 5 , 7 , 5 , 7 , 8 } \{1, 3, 5, 7, 5, 7, 8\} {1,3,5,7,5,7,8}, 那么这个数据集的基数集为 { 1 , 3 , 5 , 7 , 8 } \{1, 3, 5 ,7, 8\} {1,3,5,7,8},基数(不重复元素)为 5。

每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2 ^ 64 个不同元素的基数。HyperLogLog 是一种算法,它提供了不精确的去重计数方案。基数估计就是在误差可接受的范围内,快速计算基数。

比如统计网页的浏览用户数量,一天内同一个用户多次访问只算一次。传统的解决方案是使用 Set 来保存用户 id,然后统计 Set 中的元素数量。这种方案只能承载少量用户,一旦用户数量大起来就需要消耗大量的空间。而且目的是统计用户数量而不是保存用户,这是个吃力不讨好的方案。
使用 HyperLogLog 最多需要 12k 就可以统计大量的用户数。尽管它大概有 0.81% 的错误率,但对于统计用户数量这种不需要很精确的数据是可以忽略不计的。

2.1 赋值命令

pfadd
基本格式为
pfadd key element [element ...]

pfadd mykey a b c d e f g h i j

2.2 取值命令

pfcount
该命令的作用是为了获取基数,一般格式如下
pfcount key [key ...]

示例比如 pfcount mykey

2.3 合并命令

该命令可以合并多个集合的并集,一般形式如下
pfmerge destkey sourcekey [sourcekey ...]

比如命令 pfmerge mykey3 mykey mykey2 就表示将集合 mykey 以及 mykey2 合并为集合 mykey3

3. Bitmap 位图类型

当需要统计用户一年的某些信息,如活跃或不活跃,登录或不登录,打卡或没打卡。如果使用普通的 key / value存储,则要记录 365 条记录,如果用户量很大,需要的空间也会很大。

Redis 提供了 Bitmap 位图这种数据结构,Bitmap 就是通过操作二进制位来进行记录,即为 0 和 1。如果要记录 365 天的打卡情况,使用 Bitmap 表示的形式大概如下:0101000111000111……这样 365 天相当于 365 bit,又 1 字节 = 8 bit , 所以相当于使用 46 个字节即可。BitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态,其中的 key 就是对应元素本身。

实际上底层也是通过对字符串的操作来实现的。

3.1 赋值命令

setbit
一般的形式为
setbit key offset value ,表示为设置 key 的第 offset 位为 value (1 或 0)

3.2 取值命令

getbit
一般形式的命令如下
getbit key offset ,表示为获取 key 中 offset 位置设置的值,未设置过默认返回 0。

bitcount
bitcount key [start, end] ,表示为统计 key 上指定位数中为 1 的个数.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值