码迷,mamicode.com
首页 > 其他好文 > 详细

Redis中3种特殊的数据类型

时间:2019-07-23 00:27:25      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:数据结构   log   特殊   超过   就是   val   特性   必须   设置   

Redis中3种特殊的数据类型

Bitmap

Bitmap就是通过一个bit位来表示某个元素对应的值或者状态

其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现

Redis2.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;

对应内存中的值就是这样

bytebit0bit1bit2bit3bit4bit5bit6bit7
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

RedisGEO 特性在 Redis 3.2 版本中推出

这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作

GEO 的数据结构总共有六个命令

  • geoadd

  • geopos

  • geodist

  • georadius

  • georadiusbymember

  • geohash

GEOADD

GEOADD key longitude latitude member [longitude latitude member ...]

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

这些数据会以zset的结构被储存在键里面

比如设置

keySicily(意大利亚西西里岛屿)

member1Palermo(意大利西西里自治区首府 巴勒莫)

member2Catania(意大利西西里大区卡塔尼亚省首府 卡塔尼亚)

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

返回PalermoCatania的距离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

意思就是返回keySicily中处于

经度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

 

Redis中3种特殊的数据类型

标签:数据结构   log   特殊   超过   就是   val   特性   必须   设置   

原文地址:https://www.cnblogs.com/lezon1995/p/11229117.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!