吃透Redis系列:琳琅满目的数据类型(下篇,文末彩蛋)

共 4146字,需浏览 9分钟

 ·

2024-04-11 13:10

欢迎关注微信公众号: 互联网全栈架构

上一篇文章我们介绍了Redis的五种基本数据类型,详细内容请参见:吃透Redis系列:琳琅满目的数据类型(上篇)除了这几种基本的数据类型外,Redis还提供了五种扩展数据类型,从使用频率上来讲,它可能不如基本数据类型那么高,但对于某些特定应用场景,它们能很好满足,所以也有必要进行学习和了解,以便有备无患。 在文章的最后,我们用一张图来总结这十种数据类型的含义(毕竟,一图胜千言,更方便记住)。为了方便阅读,还是把这张数据类型的思维导图放出来: d13f8ec3dcda5a675575766018ba49b8.webp

1

Stream


Stream是流的意思,它类似于一个日志追加(append-only)的数据结构,在实际应用中,它主要用于实现消息队列的功能,也可以用于记录和处理各种事件,或者作为一个通知系统,把消息推送给用户或者其他系统。 在Stream中,每条数据都被赋予唯一的一个序列号,可以使用这个序列号来获取关联的数据,或者处理Stream中后面的数据,这个序列号是随着时间顺序递增的。

Stream的一些常用操作(更详细的说明请参考官方网站):

#用于向Stream中添加消息

XADD key <* | id > field value [field value ...]


#从Stream中读取消息

XREAD [COUNT count] STREAMS key [key ...] id [id ...]

#获取指定范围内的消息

XRANGE key start end [COUNT count]


#返回消息的数量

XLEN key

示例:

        
        127.0.0.1:6379> XADD mystream * name Tom age 23 height 178
"1709386483610-0"
127.0.0.1:6379> XREAD COUNT 1 STREAMS mystream 0
11"mystream"
   211"1709386483610-0"
         21"name"
            2"Tom"
            3"age"
            4"23"
            5"height"
            6"178"
127.0.0.1:6379> XRANGE mystream - +
11"1709386483610-0"
   21"name"
      2"Tom"
      3"age"
      4"23"
      5"height"
      6"178"
127.0.0.1:6379XLEN mystream
(integer) 1

2

Geospatial


翻译过来是地理空间的意思,它可以用来保存坐标并进行搜索。对于地理位置和距离计算的需求,这种数据结构非常适合。地理位置使用经度和纬度来表示。 向key中添加地理位置的命令如下(其它命令参见官网):

#将一个或者多个位置添加到key中。其中longtitude是经度,latitude是纬度,member是地理位置的名称

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

3

Bitmap


Bitmap就是位图,它不是一个真正意义上的数据结构,而是对于字符串类型的一些位操作,通过最小的单位bit来进行0和1的设置。使用它进行存储非常节省空间且运行效率高,比较适合活跃用户统计、登录天数计算、过滤器等应用场景。

Bitmap的一些常用操作:

#设置或者清除某一位上的值

SETBIT key offset value


#获取某一位上的值

GETBIT key offset


#统计1的数量

BITCOUNT key [start end [BYTE | BIT]]

示例:

      
      # 比如统计登录天数,第一天在线,第三天在线,最后统计出来一共两天在线
127.0.0.1:6379> SETBIT user-login 1 1
(integer) 0
127.0.0.1:6379> SETBIT user-login 3 1
(integer) 0
127.0.0.1:6379> GETBIT user-login 3
(integer) 1
127.0.0.1:6379> BITCOUNT user-login
(integer) 2


4

Bitfield


Bitfield(位域),它把字符串当成位数组进行处理,它 可以操作任意位长度的整数,从无符号的1位整数到有符号的63位整数。 这些值是使用二进制编码的Redis字符串来存储的。 bitfield结构支持原子的读、写和增加操作,使它们成为管理计数器和类似数值的好选择。

5

HyperLogLog


HyperLogLog,它是用来做基数统计的,所谓基数,是指集合中不同元素的个数,而基数统计是指在允许误差的情况下估算出一组数据的基数。它经常用于统计网站的ip访问量、页面的uv数等场景。

HyperLogLog的一些常用操作:

#将任意数量的元素添加到HyperLogLog

PFADD key [element [element ...]]


#返回一个或者多个key的近似基数

PFCOUNT key [key ...]


#将多个HyperLogLog合并为一个HyperLogLog

PFMERGE destkey [sourcekey [sourcekey ...]]

示例:

        
        127.0.0.1:6379> PFADD web-view "Tom" "John" "Tony"
(integer) 1
127.0.0.1:6379> PFCOUNT web-view
(integer) 3
127.0.0.1:6379> PFADD web-view2 "John"
(integer) 1
127.0.0.1:6379> PFMERGE web-view web-view2
OK
127.0.0.1:6379> PFCOUNT web-view
(integer) 3


6

总结


本文介绍了五种扩展数据类型,包括流、地理空间、位图、位域、基数统计等,它们对于一些互联网相关的业务需求非常适合,与传统的实现方案相比(比如采用关系型数据库),这些数据结构可能更有针对性、效率更高,使用起来也更为简便

为了方便记忆和理解,我们用一张示例图来总结这十种数据类型的含义:

cb5893996a2cfd4b7e975f6624cd4c19.webp


创作不易,烦请点个在看、点个赞,非常感谢!


鸣谢: https://architecturenotes.co/redis/


推荐阅读:

吃透Redis系列:琳琅满目的数据类型(上篇)

吃透Redis系列:总体介绍

离大谱,MySQL竟然无视空格的存在!

浏览 27
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报