民工哥死磕Redis教程(二):9 种数据类型和应用场景

Redis 数据结构简介

Redis 基础文章非常多,关于基础数据结构类型,我推荐你先看下官方网站内容,然后再看下面的小结。

首先对 redis 来说,所有的 key(键)都是字符串。我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash。民工哥死磕Redis教程(二):9 种数据类型和应用场景民工哥死磕Redis教程(二):9 种数据类型和应用场景

5 种基础数据类型

内容其实比较简单,我觉得理解的重点在于这个结构怎么用,能够用来做什么?所以我在梳理时,围绕图例,命令,执行和场景来阐述。民工哥死磕Redis教程(二):9 种数据类型和应用场景

String 字符串

String是redis中最基本的数据类型,一个key对应一个value。

String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。

图例

下图是一个String类型的实例,其中键为hello,值为world民工哥死磕Redis教程(二):9 种数据类型和应用场景

命令使用

民工哥死磕Redis教程(二):9 种数据类型和应用场景

命令执行

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> set counter 2
OK
127.0.0.1:6379> get counter
"2"
127.0.0.1:6379> incr counter
(integer) 3
127.0.0.1:6379> get counter
"3"
127.0.0.1:6379> incrby counter 100
(integer) 103
127.0.0.1:6379> get counter
"103"
127.0.0.1:6379> decr counter
(integer) 102
127.0.0.1:6379> get counter
"102"
实战场景
  • 缓存:经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis 作为缓存层,mysql做持久化层,降低mysql的读写压力。
  • 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
  • session:常见方案spring session + redis实现session共享,

List列表

Redis 中的 List 其实就是链表(Redis 用双端链表实现 List )。

使用 List 结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。List 的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在 List 中,然后工作线程再用 POP 操作将任务取出进行执行。

图例

民工哥死磕Redis教程(二):9 种数据类型和应用场景

命令使用
民工哥死磕Redis教程(二):9 种数据类型和应用场景
  • 使用列表的技巧
    • lpush+lpop=Stack(栈)
    • lpush+rpop=Queue(队列)
    • lpush+ltrim=Capped Collection(有限集合)
    • lpush+brpop=Message Queue(消息队列)
    • 消息队列
    • 点赞,或点踩,收藏等,可以放到set中实现
    • 有效的纬度从-85.05112878度到85.05112878度。
    • km
    • mi 英里
    • ft 英尺
    • 基于List LPUSH+BRPOP 或者 基于Sorted-Set的实现
      • 支持了持久化,但是不支持多播,分组消费等
    • 消息的消费
      • 单播和多播(多对多)
    • 阻塞和非阻塞读取
    • 消息有序性
    • 消息的持久化
    • 消息遍历
    • 消息的阻塞和非阻塞读取
    • 消息的分组消费
    • 未完成消息的处理
    • 消息队列监控
    • ...
    • 生产和消费
      • 基本的增删查改
    • 单一消费者的消费
    • 消费组的消费
    • 监控状态
    • last_delivered_id :游标,每个消费组会有个游标 last_delivered_id,任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。
    • pending_ids :消费者(Consumer)的状态变量,作用是维护消费者的未确认的 id。 pending_ids 记录了当前已经被客户端读取的消息,但是还没有 ack (Acknowledge character:确认字符)。如果客户端没有ack,这个变量里面的消息ID会越来越多,一旦某个消息被ack,它就开始减少。这个pending_ids变量在Redis官方被称之为PEL,也就是Pending Entries List,这是一个很核心的数据结构,它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理。
    • 消息内容: 消息内容就是键值对,形如hash结构的键值对,这没什么特别之处。
    • 所属消费者
    • IDLE,已读取时长
    • delivery counter,消息被读取次数