Redis实战(二)十大数据类型及其操作命令

16

基本介绍

最新版本的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 GETBITFIELD key SET,但同时 BITFIELD后面可以接多个GETSET,redis将返回每个操作的结果列表。

  • GET | SET | INCRBY:操作的类型
  • encoding:编码格式,i表示有符号整型,u表示无符号整型。iu后面接数字,如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回复。