Redis中3种特殊的数据类型
发布日期:2021-08-14 18:04:34 浏览次数:6 分类:技术文章

本文共 2897 字,大约阅读时间需要 9 分钟。

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;

对应内存中的值就是这样

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

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 Palermo1) 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 WITHDIST1) 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) 1redis> PFADD RDBMS "MySQL" "MSSQL" "PostgreSQL"(integer) 1redis> PFMERGE databases nosql RDBMSOKredis> PFCOUNT databases(integer) 6

 

转载于:https://www.cnblogs.com/lezon1995/p/11229117.html

转载地址:https://blog.csdn.net/weixin_30731305/article/details/101226994 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:算法:通过堆排序,获取前N个最大数
下一篇:HashMap 1.8 核心源码分析

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年11月19日 08时12分59秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

合并矩阵numpy_Numpy基础用法汇总 2019-06-17
a股历史30年的大盘价_2021年A股大盘走势分析预测 2019-06-17
双控专业就业机器人_被民办院校录取,专业是机器人工程,学费2.2万元,有前途吗?... 2019-06-17
小括号教学设计导入_特岗考试教学设计题万能模板和案例! 2019-06-17
react循环的值为什么要有key_为什么说尿酸值不仅高有危险,低也要注意? 2019-06-17
unity打开项目属性_Unity和Substance Painter的Look Dev显示校准 2019-06-17
mobaxterm最多10个链接_能帮助运维新手快速上手 10 个命令链接操作符! 2019-06-17
液压系统管路流速推荐表_液压系统传动中液流的连续性 2019-06-17
python学生成绩分析实验报告_预测模型——如何用python对今年的经济数据预测 2019-06-17
天玑机器人颈椎_骨科来了个全能手术“特长生”“天玑”骨科手术机器人落户广西... 2019-06-17
模块嵌套_React 快速教程(9):组件的嵌套组合 2019-06-17
移动平均滤波_卡尔曼滤波(3)-- EKF, UKF 2019-06-17
的电路接法_滑动变阻器如何正确接入电路中? 2019-06-17
golang 日志分析_Golang语言--日志库glog解析 2019-06-17
vscode 切换开发者工具_vscode二次开发界面篇 2019-06-17
protobuf2和3同时安装_protobuf深坑-版本冲突-彻底解决 2019-06-17
android释放焦点_Android videoview抢占焦点的处理方法 2019-06-17
java线程锁_java线程锁 2019-06-17
python数据输出_用Python解析数据输出 2019-06-17
java 连接池原理_连接池的原理是什么?工作原理是什么? 2019-06-17