您当前的位置:首页 > 电脑百科 > 数据库 > Redis

一文了解Reids五大对象(数据类型)

时间:2020-04-21 12:13:25  来源:  作者:

redis 是一个高性能的分布式内存型数据库,在国内外各大互联网公司中都有着广泛的使用,即使是一些非互联网公司中也有着非常重要的适用场景,所以对 Redis 的掌握也成为后端工程师必备的基础技能,在面试中,Redis早已成为老生常谈的话题,而在实际工作中,我们更是每时每刻都需要和 Redis 打交道。因此熟练的掌握Redis技术栈的各种武功秘籍至关重要!

Redis提供了五种主要的对象(数据类型)供开发者使用,它提供了强大且实用的功能。然而实际开发中有大多数的开发者仅简单会用Redis String的Get与Set。这就好比降龙十八掌,你只学会了一掌。在真正实战对敌之时不免略显单薄!这篇文章我们将回顾Redis这五大对象,以便于我们能够在实战中真正做到游刃有余。

一、字符串(终究是我扛下了所有)

字符串类型是Redis最基础的数据结构,其他几种数据结构都是在字符串类型基础上构建的。字符串类型的值是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频)等

一文了解Reids五大对象(数据类型)

字符串

字符串对象的内部编码有3种 :int、raw和embstr。Redis会根据当前值的类型和长度来决定使用哪种编码来实现。

  • int:如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示
  • raw:如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于32字节
  • embstr:如果字符串对象保存的是一个字符串值,并且这个字符申值的长度小于等于32字节

reids字符串的使用场景是最为广泛的,甚至有些对redis其它几种对象不太熟悉的人,基本所有场景都会使用字符串(序列化一下直接扔进去),这让本身很单纯的字符串承受了它这个年纪本不该承受的重量。其实Redis的主要使用场景主要有以下几种:

  1. 作为缓存层,缓存热点数据
  2. Redis字符串可以自增自减的特性可以用来做计数器、限速器、自增ID生成等
  3. 分布式系统的Session共享
  4. 二进制数据的存储

有关Redis字符串的更详细的介绍,可以查看我的这篇文章。

Redis对象——字符串(String)

二、哈希(存储对象我也行)

哈希对象用来存储一组数据对。每个数据对又包含键值两部分。

一文了解Reids五大对象(数据类型)

哈希

哈希对象也有两种实现方式。ziplist(压缩列表),hashtable(哈希表)

同样,只有当存储的数据量比较小的情况下,Redis 才使用压缩列表来实现哈希对象。具体需要满足两个条件:

  • 字典中保存的键和值的大小都要小于 64 字节;
  • 字典中键值对的个数要小于 512 个。

当不能同时满足上面两个条件的时候,Redis 就使用哈希表来实现哈希对象。

当存储的内容是对象的时候,Redis 字符串对象的很多功能使用Redis 哈希对象也可以实现。如缓存用户信息的时候,使用Redis哈希对象存储,简单直观,如果使用合理可以减少内存空间的使用。但也有其缺点,就是要要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多内存。

此外,Redis 哈希对象还可以实现购物车、计数器等功能。

有关Redis哈希对象的更详细的介绍,可以查看我的这篇文章。

Redis对象——哈希(Hash)

三、列表(栈和队列我都行)

列表这种对象支持存储一组有序的、不重复的数据。因为其有序性,它可以获取指定范围的元素列表、可以在O(1)的时间复杂度获取指定索引下标的元素等。

一文了解Reids五大对象(数据类型)

列表

在Redis3.2版本以前列表类型的内部编码有两种。当满足下面两个条件的时候,Redis 列表对象使用ziplist(压缩列表)来实现。

  • 当列表的元素个数小于list-max-ziplist-entries配置(默认512个)
  • 当列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节)

当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。

而在Redis3.2版本开始对列表数据结构进行了改造,使用 quicklist 代替了 ziplist 和 linkedlist.

由于列表对象的有序且不可重复的特性,它比较适合用来做文章、商品等列表的存储。

列表类型可以 lpush (左侧push),同时又可以使用 rpop (右侧弹出)(查询并删除)第一个元素,所以列表类型具有先进先出的特性,可以用来实现消息队列。也可以lpush(左侧push)->lpop(左侧弹出),具有后进先出的特性,因此开发中需要使用栈的时候,我们也可以借助列表对象来实现。有关Redis列表对象的更详细的介绍,可以查看我的这篇文章。

Redis对象——列表(List)

四、集合(标签系统我在行)

集合对象 (Set) 是一个无序并唯一的键值集合。它的存储顺序不会按照插入的先后顺序进行存储。与列表所不同的是它存储的数据是无序且不重复的。

一文了解Reids五大对象(数据类型)

集合

集合对象的内部编码也有两种:intset(整数集合)与hashtable(哈希表)。当满足下面两个条件的时候集合对象使用intset来实现。

  • 集合中的元素都是整数
  • 集合中的元素个数小于set-maxintset-entries配置(默认512个)

不满足上面两个条件时集合对象使用hashtable来实现。

集合对象的主要几个特性就是,无序、不可重复、支持并交差,因此可以用来做标签系统。

而集合的 SPOP(随机移除并返回集合中一个或多个元素) 和 SRANDMEMBER(随机返回集合中一个或多个元素) 命令可以帮助我们实现一个抽奖系统。

有关Redis集合对象的更详细的介绍,可以查看我的这篇文章。

Redis对象——集合(Set)

五、有序集合(排起名来我最棒)

有序集合类型 (Sorted Set或ZSet) 相比于集合类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序结合的元素值,一个是排序值。有序集合保留了集合不能有重复成员的特性(分值可以重复),但不同的是,有序集合中的元素可以排序。

一文了解Reids五大对象(数据类型)

集合

有序集合是由 ziplist (压缩列表) 或 skiplist (跳跃表) 组成的。

当数据比较少时,有序集合使用的是 ziplist 存储的,有序集合使用 ziplist 格式存储必须满足以下两个条件:

  • 有序集合保存的元素个数要小于 128 个;
  • 有序集合保存的所有元素成员的长度都必须小于 64 字节。

如果不能满足以上两个条件中的任意一个,有序集合将会使用 skiplist 结构进行存储。

有序集合比较典型的使用场景就是排行榜系统例如学生成绩的排名。某视频(博客等)网站的用户点赞、播放排名、电商系统中商品的销量排名等

有关Redis有序集合对象的更详细的介绍,可以查看我的这篇文章。

Redis对象——有序集合(ZSet)

小结#

Redis提供了五种最基础也是最常用的对象(数据类型):String、Hash、List、Set、ZSet。了解这五种对象的有助于我们更好的在日常开发中对Redis进行使用。而通过这篇文章我们可以看到每种对象都是通过多种数据结构来实现的,大家可以思考一下为什么



Tags:Reids   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Redis 是一个高性能的分布式内存型数据库,在国内外各大互联网公司中都有着广泛的使用,即使是一些非互联网公司中也有着非常重要的适用场景,所以对 Redis 的掌握也成为后端工程...【详细内容】
2020-04-21  Tags: Reids  点击:(130)  评论:(0)  加入收藏
▌简易百科推荐
Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查问题时就会一头雾水。...【详细内容】
2022-11-01  呆萌小可萘日常    Tags:Redis   点击:(5)  评论:(0)  加入收藏
HyperLogLog,可能很多人对Redis这个功能都很陌生,在日常开发中也很少用到它,或者用了它也没有深入的了解过,下面我们将详细介绍。HyperLogLog简称HLL,它是LogLog算法的升级版,其功...【详细内容】
2022-10-26  搬长你好  今日头条  Tags:Redis   点击:(10)  评论:(0)  加入收藏
下载地址:下载界面:下载好之后进行安装安装界面下一步安装路径的改动默认下一步继续下一步安装点击完成这是我们的安装目录最简单的启动方式是直接双击redis-server.exe如果要...【详细内容】
2022-10-10  分享电脑学习  搜狐号  Tags:Redis   点击:(18)  评论:(0)  加入收藏
很难大规模操作有状态的分布式系统,Redis 也不例外。托管数据库通过承担大部分繁重工作使生活变得更轻松。但是您仍然需要一个健全的架构并在服务器(Redis)和客户端(应用程序)上...【详细内容】
2022-10-08  qaseven  网易号  Tags:Redis   点击:(19)  评论:(0)  加入收藏
Apache Kafka 已成为大多数技术栈中的主流组件。使用 Kafka 的好处包括确保事件中的因果顺序,同时保持并行性,通过在服务器之间快速复制分区来恢复故障,等等。 然而,运行 Kafka...【详细内容】
2022-10-04  解道Jdon  今日头条  Tags:Redis   点击:(36)  评论:(0)  加入收藏
一、背景公司基于业务发展以及战略部署,需要实现在多个数据中心单元化部署,一方面可以实现多数据中心容灾,另外可以提升用户请求访问速度。需要保证多数据中心容灾或者实现用户...【详细内容】
2022-09-28  京东云    Tags:Redis   点击:(43)  评论:(0)  加入收藏
一、RedisInsight 简介RedisInsight 是一个高颜值,直观高效的 Redis GUI 管理工具,它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控,并且可以在界面上使用 CL...【详细内容】
2022-09-18  Python部落  今日头条  Tags:Redis   点击:(105)  评论:(0)  加入收藏
一、Redis为什么那么快 QPS达到10万/秒 用C语言实现 基于内存 单线程,不用线程上下文切换及加锁二、redis数据类型 String,常见的缓存,存储登录session等 hash,存储对象,单独修...【详细内容】
2022-09-16  互联网资讯看板  网易号  Tags:Redis   点击:(74)  评论:(0)  加入收藏
1、集群原理简介1.1、什么是集群?什么是分区?集群简单的说就是将同一个服务部署在不同的机器上,从而提高服务的横向扩展能力。分区就是将数据分布在多个实例(服务器)上,让每一个实...【详细内容】
2022-09-15  互联共商   网易号  Tags:Redis集群   点击:(54)  评论:(0)  加入收藏
Redis 的持久化方式有两种:AOF 日志和 RDB 快照。所以接下来,针对这两种持久化方式具体分析分析...【详细内容】
2022-09-14  IT互联网新资讯  今日头条  Tags:Redis   点击:(51)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条