Redis中3种特殊的数据类型
Bitmap
Bitmap
就是通过一个bit
位来表示某个元素对应的值或者状态
其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现
Redis
从 2.2
版本之后新增了setbit
, getbit
, bitcount
等几个 bitmap 相关命令
虽然是新命令,但是本身都是对字符串的操作
SETBIT key offset value
其中 offset
必须是数字,value 只能是 0
或者 1
这个命令的返回值是修改前的值
比如调用
setbit byte0 0 1; setbit byte0 2 1; setbit byte0 5 1; ? setbit byte1 1 1; setbit byte1 4 1;
对应内存中的值就是这样
byte | bit0 | bit1 | bit2 | bit3 | bit4 | bit5 | bit6 | bit7 |
---|---|---|---|---|---|---|---|---|
byte0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
byte1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
可以看出 bit
的默认值是 0
,那么 Bitmap
在实际开发的运用呢?
这里举一个例子:储存用户在线状态
这里只需要一个 key,然后把用户 ID 作为 offset
,如果在线就设置为 1
,不在线就设置为 0
//设置在线状态 $redis->setBit online 0 1; ? //设置离线状态 $redis->setBit online 0 0; ? //获取状态 $redis->getBit online 0; ? //获取在线人数 $redis->bitCount online;
Geo
Redis
的 GEO
特性在 Redis 3.2
版本中推出
这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作
GEO 的数据结构总共有六个命令
geoadd
geopos
geodist
georadius
georadiusbymember
geohash
GEOADD
GEOADD key longitude latitude member [longitude latitude member ...]
将给定的空间元素(纬度、经度、名字)添加到指定的键里面
这些数据会以zset
的结构被储存在键里面
比如设置
key
为Sicily
(意大利亚西西里岛屿)
member1
为Palermo
(意大利西西里自治区首府 巴勒莫)
member2
为Catania
(意大利西西里大区卡塔尼亚省首府 卡塔尼亚)
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania" (integer) 2
GEOPOS
GEOPOS key member [member ...]
从键里面返回所有给定位置元素的位置(经度和纬度)
比如调用GEOPOS Sicily Palermo
返回Palermo
的经纬度
redis> GEOPOS Sicily Palermo 1) 1) "13.361389338970184" 2) "38.115556395496299"
GEODIST
GEODIST key member1 member2 [unit]
返回两个给定位置之间的距离
如果两个位置之间的其中一个不存在, 那么返回null
指定单位的参数 unit
必须是以下单位的其中一个:(默认为m)
m
米km
千米mi
英里ft
英尺
比如调用GEODIST Sicily Palermo Catania
返回Palermo
与Catania
的距离166274.15米
redis> GEODIST Sicily Palermo Catania "166274.15156960039"
GEORADIUS
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素
距离单位和上面的一致,其中后面的选项:
WITHDIST
在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回
距离的单位和用户给定的范围单位保持一致
WITHCOORD
将位置元素的经度和维度也一并返回
WITHHASH
以
52
位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值这个选项主要用于底层应用或者调试, 实际中的作用并不大
比如调用GEORADIUS Sicily 15 37 200 km WITHDIST
意思就是返回key
为Sicily
中处于
以经度15
,纬度37
为圆心,半径200km
的圆形范围内的元素,以及元素到圆心的距离
redis> GEORADIUS Sicily 15 37 200 km WITHDIST 1) 1) "Palermo" 2) "190.4424" 2) 1) "Catania" 2) "56.4413"
HyperLogLog
Redis
的基数统计
这个结构可以非常省内存的去统计各种计数,比如注册 IP 数
、每日访问 IP 数
、页面实时UV
、在线用户数
等
但是它也有局限性,就是只能统计数量,而没办法去知道具体的内容是什么
PFADD
redis> PFADD databases "Redis" "MongoDB" "MySQL" (integer) 1 ? redis> PFADD databases "Redis" # Redis 已经存在,不必对估计数量进行更新 (integer) 0
PFCOUNT
redis> PFCOUNT databases (integer) 3
PFMERGE
PFMERGE destkey sourcekey [sourcekey ...]
将多个 HyperLogLog
合并为一个 HyperLogLog
合并后的 HyperLogLog
的基数接近于所有输入 HyperLogLog
的可见集合的并集
合并得出的 HyperLogLog
会被储存在 destkey
键里面
如果该键并不存在,那么命令在执行之前, 会先为该键创建一个空的 HyperLogLog
redis> PFADD nosql "Redis" "MongoDB" "Memcached" (integer) 1 redis> PFADD RDBMS "MySQL" "MSSQL" "PostgreSQL" (integer) 1 redis> PFMERGE databases nosql RDBMS OK redis> PFCOUNT databases (integer) 6
原文地址:https://www.cnblogs.com/lezon1995/p/11229117.html