博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis 中三种特殊的数据类型
阅读量:6388 次
发布时间:2019-06-23

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

Reids 在 Web 应用的开发中使用非常广泛,几乎所有的后端技术都会有涉及到 Redis 的使用。Redis 种除了常见的字符串 String、字典 Hash、列表 List、集合 Set、有序集合 SortedSet 等等之外,还有一些不常用的数据类型,这里着重介绍三个。

BitMap

BitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态, 其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现。Redis 从 2.2 版本之后新增了setbit, getbit, bitcount 等几个 bitmap 相关命令。虽然是新命令,但是本身都是对字符串的操作,我们先来看看语法:

SETBIT key offset value复制代码

其中 offset 必须是数字,value 只能是 0 或者 1,咋一看感觉没啥用处,我们先来看看 bitmap 的具体表示,当我们使用命令 setbit key (0,2,5,9,12) 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', $uid, 1);//设置离线状态$redis->setBit('online', $uid, 0);//获取状态$isOnline = $redis->getBit('online', $uid);//获取在线人数$isOnline = $redis->bitCount('online');复制代码

Geo

Redis 的 GEO 特性在 Redis 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作。GEO 的数据结构总共有六个命令:geoadd、geopos、geodist、georadius、georadiusbymember、gethash,这里着重讲解几个。

  1. GEOADD
GEOADD key longitude latitude member [longitude latitude member ...]复制代码

将给定的空间元素(纬度、经度、名字)添加到指定的键里面。 这些数据会以有序集合的形式被储存在键里面, 从而使得像 GEORADIUS 和 GEORADIUSBYMEMBER 这样的命令可以在之后通过位置查询取得这些元素。例子:

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"(integer) 2复制代码

2.GEOPOS

GEOPOS key member [member ...]复制代码

从键里面返回所有给定位置元素的位置(经度和纬度),例子:

redis> GEOPOS Sicily Palermo Catania NonExisting1) 1) "13.361389338970184"   2) "38.115556395496299"复制代码

3.GEODIST

GEODIST key member1 member2 [unit]复制代码

返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。指定单位的参数 unit 必须是以下单位的其中一个:(默认为m)

m   表示单位为米。km  表示单位为千米。mi  表示单位为英里。ft  表示单位为英尺。复制代码
redis> GEODIST Sicily Palermo Catania"166274.15156960039"复制代码

4.GEORADIUS

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]复制代码

以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。距离单位和上面的一致,其中后面的选项:

WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。WITHCOORD: 将位置元素的经度和维度也一并返回。WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。这个选项主要用于底层应用或者调试, 实际中的作用并不大。复制代码
redis> GEORADIUS Sicily 15 37 200 km WITHDIST1) 1) "Palermo"   2) "190.4424"2) 1) "Catania"   2) "56.4413"复制代码

HyperLogLog

Redis 的基数统计,这个结构可以非常省内存的去统计各种计数,比如注册 IP 数、每日访问 IP 数、页面实时UV)、在线用户数等。但是它也有局限性,就是只能统计数量,而没办法去知道具体的内容是什么。 当然用集合也可以解决这个问题。但是一个大型的网站,每天 IP 比如有 100 万,粗算一个 IP 消耗 15 字节,那么 100 万个 IP 就是 15M。而 HyperLogLog 在 Redis 中每个键占用的内容都是 12K,理论存储近似接近 2^64 个值,不管存储的内容是什么,它一个基于基数估算的算法,只能比较准确的估算出基数,可以使用少量固定的内存去存储并识别集合中的唯一元素。而且这个估算的基数并不一定准确,是一个带有 0.81% 标准错误的近似值。 这个数据结构的命令有三个:PFADD、PFCOUNT、PFMERGE

1.PFADD

redis> PFADD  databases  "Redis"  "MongoDB"  "MySQL"(integer) 1redis> PFADD  databases  "Redis"    # Redis 已经存在,不必对估计数量进行更新(integer) 0复制代码

2.PFCOUNT

redis> PFCOUNT  databases(integer) 3复制代码

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复制代码

欢迎关我的个人公众号:左手代码(公众号后台发送 jetbrains,你懂得~)

转载地址:http://gpdha.baihongyu.com/

你可能感兴趣的文章
交通部:加大人工售票力度保障农民工春运出行
查看>>
物联网的学术层、应用层和行为层的基本介绍
查看>>
初探github(一)
查看>>
源码分析之 LinkedList
查看>>
免SDK实现微信/支付宝转账打赏功能
查看>>
安卓.9图片制作
查看>>
MySQL 高可用性keepalived+mysql双主
查看>>
Python环境安装及数据基本预处理-大数据ML样本集案例实战
查看>>
【详解】TiDB 2.0 GA is here !
查看>>
iOS开发-模拟网络环境
查看>>
Redux执行流程梳理
查看>>
iOS 指纹识别
查看>>
说说 Vue.js 组件
查看>>
iPhone 用USB连接SSH的时候一直报错
查看>>
关于Vuex的action传入多个参数的问题
查看>>
放弃jQuery, 使用原生js
查看>>
跨越适配&性能那道坎,企鹅电竞Android weex优化
查看>>
一文读懂鼠标滚轮事件(wheelEvent)
查看>>
腾讯云国内节点centos7.2安装k8sv1.12.3
查看>>
Python爬虫--- 1.5 爬虫实践: 获取百度贴吧内容
查看>>