Redis实战(二)十大数据类型及其操作命令
基本介绍
最新版本的Redis支持10种数据类型,分别是:string、set、hash、zset、list、bitmap、geospatial、bitfield、hyperLoglog。
- string:用来储存字符串,同时支持元素级的累加
- set:无序集合,支持集合相关的操作(并、交、差)
- hash:类似于java中的HashMap,支持元素级的累加
- zset:有序集合,与set的区别是每个元素都带有一个score,元素根据score进行排序
- list:列表,底层实现是双端链表,可以从左右两侧推入和弹出元素
- bitmap:位图,可以设置bit串中的某个bit位的值。底层数据类型为string,string的长度会随着bit串的长度以2的幂次递增
- geospatial:地理信息,用来储存经纬度,底层使用zset数据结构,根据经纬度信息计算score
- bitfield:位域,可以同时对多个位进行操作,底层使用string数据结构实现
- hyperLoglog:基数统计,可以使用固定大小的空间来对任意个数的数据进行基数统计。在应用上可以做UniqueVisit(UV)统计
- stream:流,和java中的Stream是两码事,stream出现的目的是为了取代MQ,但是感觉它的位置比较尴尬,使用也存在限制,也没有现存的消息队列好用。个人感觉小项目可用,大项目,专业的事交给专业的人
支持的操作
原生的Redis命令执行时具有具有原子性
string
应用场景
在redis的所有数据类型中stirng是用的最广泛的。常用于:
- 短信验证码
- 记录用户登陆状态(token)
- 记录投票数
- 商品实时销量
- ...
set
常用命令
应用场景
set常见的应用场景有:
- 微信抽奖小程序——随机从集合中弹出10个幸运之子
- 微信朋友圈同赞朋友——取并集
- QQ可能认识的人——取差集
- ...
hash
常用命令
应用场景
hash常见的应用场景有:
- 用户购物车——商品作为hash-key,商品数量作为hash-value
- ...
zset
常用命令
应用场景
sortedset的应用场景有:
- 商品的销售排行榜——售出数量作为score
- 主播的打赏排行榜——打赏价值作为score
- ...
list
常用命令
应用场景
list的常见应用场景有:
- 浏览博客文章——作者的博文在一个列表中,一次从中拉取10条
- 用户的购物历史、浏览记录——这些都可以放到list中,利用lrange进行拉取
- ...
bitmap
常用命令
BITCOUNT key [start end [BYTE | BIT]]
计算字符串中设置位数(人口计数)。
GETBIT key offset
获取指定偏移处的值
SETBIT key offset value
设置指定偏移处的值
BITPOS key bit [start [end [BYTE | BIT]]]
从指定位置查找设置位(1)或清除位(0)
BITOP <AND | OR | XOR | NOT> destkey key [key ...]
对多个bit串进行位操作
应用场景
bitmap的应用场景:
- 用户打卡情况统计
- 用户登陆情况统计
- ...
geospatial
常用命令
GEOHASH key member [member ...]
解释: 用于返回一个或多个位置元素的 Geohash表示。Redis GEO 使用 geohash 来保存地理位置的坐标。
GEOPOS key member [member ...]
解释: Redis GEOPOS 命令用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
GEODIST key member1 member2 [m|km|ft|mi]
解释: Redis GEODIST 命令用于返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
解释: Redis georadius
命令以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
georadiusbymember
和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember
的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。
GEOADD key longitude latitude member [longitude latitude member ...]
解释:Redis GEOADD 用于将给定的空间元素(纬度、经度、名字)添加到指定的键里面。 这些数据会以有序集合的形式被储存在键里面,从而使得像 GEORADIUS 和 GEORADIUSBYMEMBER 这样的命令可以在之后通过位置查询取得这些元素。
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
解释: Redis georadiusbymember
和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember
的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。
应用场景
geospatial的常用应用场景:
- 地图应用——可快速获取用户收藏位置、计算用户当前位置和用户收藏位置的距离
- ...
bitfield
常用命令
BITFIELD key [GET encoding offset | [OVERFLOW <WRAP | SAT | FAIL>]
<SET encoding offset value | INCRBY encoding offset increment>
[GET encoding offset | [OVERFLOW <WRAP | SAT | FAIL>]
<SET encoding offset value | INCRBY encoding offset increment>
...]]
解释: 该指令参数较多,其实该指令可以拆分为BITFIELD key GET
和BITFIELD key SET
,但同时 BITFIELD
后面可以接多个GET
或SET
,redis将返回每个操作的结果列表。
- GET | SET | INCRBY:操作的类型
- encoding:编码格式,
i
表示有符号整型,u
表示无符号整型。i
和u
后面接数字,如i16
表示编码格式为16位有符号整数。 - offset:操作的偏移量,表示在第几位进行操作,如果encoding设置的
i8
,offset设置的16
表示操作16-23位。 - OVERFLOW:溢出控制,WRAP 环绕:如果一个编码格式为
i8
,操作对应的值为127,如果对该值+1,这时候会产生溢出,wrap会使该值变为-128。SAT:同上,如果对该值+任意数,sat会产生截断效果,该值无论怎么加都不会超过它的最大表示范围,减法同理。FAIL:当产生溢出时,使操作失效。
应用场景
该数据类型可以用到的情况不多,暂不清楚其适合的场景。
hyperLoglog
常用命令
PFADD key [element [element ...]]
解释: 将所有元素参数添加到存储在指定为第一个参数的变量名称处的 HyperLogLog 数据结构中。
PFCOUNT key [key ...]
解释: 返回指定的key对应的基数列表
PFMERGE destkey [sourcekey [sourcekey ...]]
解释: 合并多个HyperLoglog数据到一个指定的key中
应用场景
hyperLoglog的常见应用场景有:
- 亿级UV统计
- ...
stream
这里只阐述一下它的操作流程,具体操作码不做赘述。
和其他MQ一样,stream中也有组的概念,同组消费者共享队列中的游标。从队列中消费了消息,stream如果没有收到ack回复,则不认为这些消息已被成功消息,它会将这些消息标记为悬而未决的消息(可用用XPENDING命令查看)。如果消费者成功消费了消息,需要向stream发送ack回复。