一文搞定Redis五大数据类型及使用场景

Redis 是一种基于键值对的NoSQL数据库,它的值主要由string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)五种基本数据结构构成,除此之外还支持一些其他的数据结构和算法。key都是由字符串构成的,那么这五种数据结构的使用场景有哪些?一起来看看!

字符串

字符串类型是Redis最基础的数据结构,字符串类型可以是JSON、XML甚至是二进制的图片等数据,但是最大值不能超过512MB。

1.1 内部编码

Redis会根据当前值的类型和长度决定使用哪种内部编码来实现。
字符串类型的内部编码有3种:
  • int:8个字节的长整型。
  • embstr:小于等于39个字节的字符串。
  • raw:大于39个字节的字符串。

1.2 使用场景

1.2.1 缓存

在web服务中,使用MySQL作为数据库,Redis作为缓存。由于Redis具有支撑高并发的特性,通常能起到加速读写和降低后端压力的作用。web端的大多数请求都是从Redis中获取的数据,如果Redis中没有需要的数据,则会从MySQL中去获取,并将获取到的数据写入redis。

1.2.2 计数

Redis中有一个字符串相关的命令incr key,incr命令对值做自增操作,返回结果分为以下三种情况:
  • 值不是整数,返回错误
  • 值是整数,返回自增后的结果
  • key不存在,默认键为0,返回1
比如文章的阅读量,视频的播放量等等都会使用redis来计数,每播放一次,对应的播放量就会加1,同时将这些数据异步存储到数据库中达到持久化的目的。

1.2.3 共享Session

在分布式系统中,用户的每次请求会访问到不同的服务器,这就会导致session不同步的问题,假如一个用来获取用户信息的请求落在A服务器上,获取到用户信息后存入session。下一个请求落在B服务器上,想要从session中获取用户信息就不能正常获取了,因为用户信息的session在服务器A上,为了解决这个问题,使用redis集中管理这些session,将session存入redis,使用的时候直接从redis中获取就可以了。

1.2.4 限速

为了安全考虑,有些网站会对IP进行限制,限制同一IP在一定时间内访问次数不能超过n次。

哈希

Redis中,哈希类型是指一个键值对的存储结构。

2.1 内部编码

哈希类型的内部编码有两种:
  • ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)同时所有值都小于hash-max-ziplist-value配置(默认64字节)时使用。ziplist使用更加紧凑的结构实现多个元素的连续存储,所以比hashtable更加节省内存。
  • hashtable(哈希表):当ziplist不能满足要求时,会使用hashtable。

2.2 使用场景

由于hash类型存储的是一个键值对,比如数据库有以下一个用户表结构
id name age
1 Java旅途 18
将以上信息存入redis,用表明:id作为key,用户属性作为值:
hset user:1 name Java旅途 age 18
使用哈希存储会比字符串更加方便直观

列表

列表类型用来存储多个有序的字符串,一个列表最多可以存储2^32-1个元素,列表的两端都可以插入和弹出元素。

3.1 内部编码

列表的内部编码有两种:
  • ziplist(压缩列表):当哈希类型元素个数小于list-max-ziplist-entries配置(默认512个)同时所有值都小于list-max-ziplist-value配置(默认64字节)时使用。ziplist使用更加紧凑的结构实现多个元素的连续存储,所以比hashtable更加节省内存。
  • linkedlist(链表):当ziplist不能满足要求时,会使用linkedlist。

3.2 使用场景

3.2.1 消息队列

列表用来存储多个有序的字符串,既然是有序的,那么就满足消息队列的特点。使用lpush+rpop或者rpush+lpop实现消息队列。除此之外,redis支持阻塞操作,在弹出元素的时候使用阻塞命令来实现阻塞队列。

3.2.2 栈

由于列表存储的是有序字符串,满足队列的特点,也就能满足栈先进后出的特点,使用lpush+lpop或者rpush+rpop实现栈。

3.2.3 文章列表

因为列表的元素不但是有序的,而且还支持按照索引范围获取元素。因此我们可以使用命令lrange key 0 9分页获取文章列表

集合

集合类型也可以保存多个字符串元素,与列表不同的是,集合中不允许有重复元素并且集合中的元素是无序的。一个集合最多可以存储2^32-1个元素。

4.1 内部编码

集合类型的内部编码有两种:
  • intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,redis会选用intset来作为集合的内部实现,从而减少内存的使用。
  • hashtable(哈希表):当intset不能满足要求时,会使用hashtable。

4.2 使用场景

4.2.1 用户标签

例如一个用户对篮球、足球感兴趣,另一个用户对橄榄球、乒乓球感兴趣,这些兴趣点就是一个标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同感兴趣的标签。给用户打标签的时候需要①给用户打标签,②给标签加用户,需要给这两个操作增加事务。
  • 给用户打标签
sadd user:1:tags tag1 tag2
  • 给标签添加用户
sadd tag1:users user:1
sadd tag2:users user:1
使用交集(sinter)求两个user的共同标签
sinter user:1:tags user:2:tags

4.2.2 抽奖功能

集合有两个命令支持获取随机数,分别是:
  • 随机获取count个元素,集合元素个数不变
srandmember key [count]
  • 随机弹出count个元素,元素从集合弹出,集合元素个数改变
spop key [count]
用户点击抽奖按钮,参数抽奖,将用户编号放入集合,然后抽奖,分别抽一等奖、二等奖,如果已经抽中一等奖的用户不能参数抽二等奖则使用spop,反之使用srandmember。

有序集合

有序集合和集合一样,不能有重复元素。但是可以排序,它给每个元素设置一个score作为排序的依据。最多可以存储2^32-1个元素。

5.1 内部编码

有序集合类型的内部编码有两种:
  • ziplist(压缩列表):当有序集合的元素个数小于list-max-ziplist-entries配置(默认128个)同时所有值都小于list-max-ziplist-value配置(默认64字节)时使用。ziplist使用更加紧凑的结构实现多个元素的连续存储,更加节省内存。
  • skiplist(跳跃表):当不满足ziplist的要求时,会使用skiplist。

5.2 使用场景

5.2.1 排行榜

用户发布了n篇文章,其他人看到文章后给喜欢的文章点赞,使用score来记录点赞数,有序集合会根据score排行。流程如下
用户发布一篇文章,初始点赞数为0,即score为0
zadd user:article 0 a
有人给文章a点赞,递增1
zincrby user:article 1 a
查询点赞前三篇文章
zrevrangebyscore user:article 0 2
查询点赞后三篇文章
zrangebyscore user:article 0 2

5.2.2 延迟消息队列

下单系统,下单后需要在15分钟内进行支付,如果15分钟未支付则自动取消订单。将下单后的十五分钟后时间作为score,订单作为value存入redis,消费者轮询去消费,如果消费的大于等于这笔记录的score,则将这笔记录移除队列,取消订单。

总结

在开发中,字符串类型是用的最多的数据类型,导致我们忽视了redis的其他四种数据类型,在具体场景下选择具体的数据类型对提升redis性能有非常大的帮助。redis虽然支持消息队列的实现,但是并不支持ack。所以redis实现的消息队列不能保证消息的可靠性,除非自己实现消息确认机制,不过这非常麻烦,所以如果是重要的消息还是推荐使用专门的消息队列去做。
(0)

相关推荐

  • 一文读懂 Redis 常见对象类型的底层数据结构

    (给数据分析与开发加星标,提升数据技能) 转自:伍陆七, 链接:cnblogs.com/chentianming/p/13838347.htm Redis 是一个基于内存中的数据结构存储系统,可以用作 ...

  • Redis 核心篇:唯快不破的秘密

    " 天下武功,无坚不摧,唯快不破! " 学习一个技术,通常只接触了零散的技术点,没有在脑海里建立一个完整的知识框架和架构体系,没有系统观.这样会很吃力,而且会出现一看好像自己会,过 ...

  • Redis 数据结构

    一.Redis简介 Redis是一款基于key-value的高性能NoSQL数据库,开源免费,遵守BSD协议.支持string(字符串) . hash(哈希) .list(列表) . set(集合) ...

  • 学习下Redis这个核心数据类型

    string 字符串 tring 类型是二进制安全的,即 string 中可以包含任何数据. Redis 中的普通 string 采用 raw encoding 即原始编码方式,该编码方式会动态扩容, ...

  • 如何使用好 Redis 内存数据库

    接下来,我们来聊聊如何使用好 Redis 内存数据库. 目前主流的内存数据库是 Redis,它使用 IO 多路复用机制监听多个文件描述符的读写事件,然后使用单线程来处理任务.如下图所示. 虽然能避免线 ...

  • Redis 5大数据结构

    一.字符串 字符串类型是redis最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习尊定基础.字符串类型实际上可以是字符串(简 ...

  • java开发技术之Redis类型技能入门篇

    字符串 首先Redis数据存储都会以key value 的形式进行存放, 所有的key都是字符串类型.此处所说的类型特指的是value中存放的类型.下文所讲的hash.列表都是基于value上进行讲解 ...

  • 5类降压药物有何区别?男性和女性如何选择降压药?一文搞定!

    作者:高丽丽 来源:药评中心 高血压是一种常见的慢性病.女性高血压受年龄.月经周期.生育及疾病过程和特殊药物等多方面影响,比男性高血压更复杂.那么,男性高血压和女性高血压患者,在选择降压药方面有什么区 ...

  • 5类降压药物有何区别?男性和女性该如何选择降压药?一文搞定!

    *仅供医学专业人士阅读参考 妊娠期.哺乳期.更年期......用药各不同! 高血压是一种常见的慢性病.女性高血压受年龄.月经周期.生育及疾病过程和特殊药物等多方面影响,比男性高血压更复杂.那么,男性高 ...

  • 一文搞定最值系列之“瓜豆原理”(附word)

    作者简介: 朱昌伟,中学教师,9年教龄.毕业于北京师范大学,双学士学位.江苏省"优秀青年教师",现任深圳市耐思培优总校区理科教研组长,主编的<初中几何模型与解题通法>已 ...

  • 一文搞定初中数学9大重要几何模型

    重要几何模型1--半角模型 模型特点 倍长中线或类中线(与中点有关的线段)构造全等三角形 如图①: (1)∠2=1/2∠AOB:(2)OA=OB. 如图②: 连接 FB,将△FOB 绕点 O 旋转至△ ...

  • 一文搞定!MR上脑出血信号的演变机制

    之前写过一篇关于脑出血MR信号演变机制的文章,可能是有点偏难,阅读人数很低,后来我就把这篇文章删了.不过在2020年放射规培结业理论考试中,脑出血MR信号演变居然考了一道大题(多选题),既然这么重要, ...

  • 尿路感染经久不愈?医生必知的病因和治疗原则一文搞定!

    全科学苑         作  者 | 何家扬 编  辑 | 小浣熊 王女士今年46岁,自一年多前患尿路感染后,一直不见好,多方求医,用过不少药物,如左氧氟沙星.三金片.宁泌泰--也不见效,症状时好时 ...

  • 手足癣的问诊和用药方案,一文搞定

    ▍来源:药店人春节万物生发,这其中,就包括让人烦躁的手足癣!瘙痒!水疱!溃烂!角化!每一个症状都让患者痛苦也让药店人心塞. 今天,我们就来讨论一下手足癣的相关知识方便患者对症求助也方便药店人指导患者用 ...

  • 一文搞定瓜豆原理

    本文综合了各路大神的杰作,在此一并感谢!