Redis的数据类型

目录

string 

1.编码方式

2.应用场景 

3.常用命令 

hash

1.编码方式

2.应用场景

3.常用命令 

list 

1.编码方式

2.应用场景 

3.常用命令 

set 

1.编码方式

2.应用场景

3.常用命令

zset 

1.编码方式

2.应用场景

3.常用命令

如何理解Redis的编码方式 

embstr 

raw

ziplist 

quicklist

inset

skiplist

string

1.编码方式

1.int

当value的值为数字时,系统会识别并自动设置编码方式为int。

注意:当存储的是小数时,存的是字符串类型,所以在计算过程中需要先转为小数,计算完成后再转为字符串存储。效率比较低下。

2.embstr

当value是长度小于等于44字节的字符串时采用

3.raw

当value是长度大于44字节的字符串时采用

2.应用场景 

1.缓存:可以将计算得到的结果或数据库查询结果存储在 Redis 中,以避免重复计算或查询。

2.计数器:因为value常常会使用到数字,所以可以当作计数器使用,通过 INCR、DECR 等命令,可以方便地对存储的数字进行递增或递减操作。

3.会话管理:用于存储用户会话信息,比如用户登录状态、用户配置信息等。通过将用户信息存储在string中,可以方便地进行读写操作。

3.常用命令 

set、get、keys、getrange、incr、decr、incrby、append、strlen、exists、del、mget、mset、incrbyfloat、expire、ttl。

hash

1.编码方式

1.ziplist

当键值对数量比较少,且键和值的大小都适中时,Redis 使用压缩列表进行编码。

2.hashtable

当键值对数量较多,或者键或值的大小较大时,Redis 使用哈希表进行编码。

3.ziplist 和 hashtable 的混合编码

键值对数量较多,但其中一部分键值对较小且可以使用压缩列表编码时,Redis 会使用混合编码。

2.应用场景

1.用户信息存储

用于存储用户信息,每个用户对应一个hash,其中的键值对可以包括用户名、密码、电子邮件地址等信息。

2.缓存对象:

用于缓存一些结构化的对象,例如网页内容、API 响应等。每个缓存对象对应一个hash,方便按需获取和更新对象的属性。

3.存储表单数据

用于存储表单提交的数据,例如用户填写的表单信息。每个表单对应一个hash,而hash中的键值对表示表单字段和对应的值。

3.常用命令 

hset、hget、hexists、hdel、hkeys、hvals、hgetall、hmget、hscan、hlen、hincrby、hincrfloat

list 

1.编码方式

1.ziplist

当list中的元素数量较少,且每个元素的大小适中时,Redis 会使用压缩列表进行编码。

2.linkedlist

当list中的元素数量较多,或者每个元素的大小较大时,Redis 会使用双向链表进行编码。

2.应用场景 

1.消息队列

可以用作简单的消息队列。生产者通过 LPUSH 命令将消息推送到列表的左侧,而消费者则通过 RPOP 或 BRPOP 命令从右侧弹出消息。这样可以实现轻量级的消息队列。

2.存储有序数据集

当需要按照顺序存储一系列数据时,也可以作为有序数据集的一种存储方式。

3.任务调度

用于实现简单的任务调度系统。通过 LPUSH 将任务添加到列表的左侧,并使用消费者从右侧获取并执行任务。

3.常用命令 

lpush、rpush、lpop、rpop、lrange、lindex、linsert、lrem、llen、brpop、blpop

set 

1.编码方式

1.intset

当元素都是整数,并且元素数量较少时,Redis 使用整数集合进行编码。

2.hashtable

当元素不是全部为整数,或者元素数量较多时,Redis 使用哈希表进行编码。

2.应用场景

1.标签系统

用于存储标签信息,例如文章的标签、商品的标签等。每个元素代表一个标签,set中的元素都是唯一的。

2.在线用户列表

用于存储当前在线的用户列表。当用户登录或退出时,可以通过set中的元素添加或移除用户,实现实时在线用户管理。

3.无序集合操作

用于对集合进行交集、并集、差集等操作。Redis 提供了丰富的集合操作命令,例如 SINTER、SUNION、SDIFF 等,便于处理集合之间的关系。

4.衡量用户量和用户规模

当同一个用户访问多次服务器,根据set进行去重,后台只显示该用户的一次访问记录

3.常用命令

sadd、smembers、sismember、spop、smove、srem、sinter、sunion、sinterstore、sunionstore、sdiff、sdiffstore

zset 

1.编码方式

1.ziplist

当有序集合中的元素数量较少且分数都可以用较小的空间表示时,Redis 使用压缩列表进行编码。

2.skiplist

当有序集合中的元素数量较多或者分数较大,无法有效利用压缩列表的优势时,Redis 使用跳跃表进行编码。

2.应用场景

1.排行榜

适用于实现排行榜功能,每个元素代表一个用户,分数表示用户的得分。通过有序集合可以方便地获取用户的排名、得分等信息。

2.最高分统计

适用于存储用户的游戏得分,通过有序集合可以按照得分排序,方便获取最高分的用户信息。

3.带权重的投票系统

用于存储投票信息,每个元素表示一个投票选项,分数表示投票数量。通过有序集合可以按照投票数量进行排序,方便获取得票最多的选项。

3.常用命令

zadd、zrem、zrange、zcard、zscore、zincrby、zinterstore、zunionstore、zrank、zpopmax、zpopmin、zrangebyscore

如何理解Redis的编码方式 

Redis设计多种编码方式是为了更好地适应不同的数据特征和使用场景,以优化性能和内存占用。不同的数据结构和数据特点可能适合不同的编码方式,因此提供多种选择可以更好地满足各种使用需求。以下是一些设计多种编码方式的原因:

  1. 灵活性和通用性:

    提供多种编码方式使得Redis能够适应广泛的应用场景。每种编码方式都有其优势,可以根据数据的特征和使用场景选择最合适的方式。
  2. 性能优化:

    不同的编码方式在不同的场景下可能有不同的性能表现。通过选择合适的编码方式,Redis可以在特定情况下提供更高效的操作。
  3. 内存占用:

    不同的编码方式对于相同数据集的内存占用可能有差异。一些编码方式能够更紧凑地存储数据,节省内存。通过选择适当的编码方式,Redis可以更好地管理内存。
  4. 数据结构的不同需求:

    不同的数据结构有不同的特性和需求,因此选择适当的编码方式可以更好地满足这些需求。例如,有序集合和集合可能选择不同的编码方式以优化排序和无序性。
  5. 节省存储空间:

    一些编码方式针对特定类型的数据集合能够提供更紧凑的存储形式,从而减少存储空间的占用。
  6. 易于扩展:

    多种编码方式使得Redis在未来的版本中能够更容易地引入新的编码方式,以适应新的需求和技术。

embstr 

1.使用定长表示形式,它将字符串的内容直接存储在字符串对象的结构中,而不需要额外的分配空间。

2.主要设计用于节省内存,特别是在字符串较短的情况下。通过避免额外的内存分配,可以降低内存消耗。

3.由于直接存储字符串内容,而不需要进行额外的内存访问,因此在访问字符串内容时具有更快的速度。

raw

1.对于raw编码的字符串,Redis 会使用动态内存分配来存储字符串内容,以适应不同长度的字符串。

2.适用于存储二进制数据,因为它不对字符串内容进行修改或假设字符编码。这使得它可以存储任意字节的数据。

3.字符串内容通过指针动态访问,相对于embstr编码可能稍慢。

ziplist 

1.主要设计用于节省内存。它采用紧凑的存储形式,通过使用变长的节点(entry)来存储元素,以便在内存占用上更加高效。

quicklist

1.每个quicklist节点中是一个ziplist,用于存储一部分列表元素。

2.支持双向遍历,使得在列表两端进行快速的遍历操作成为可能。

inset

1.采用有序数组的形式存储元素,这使得在整数集合中进行快速的二分查找成为可能,提高了查找效率。

2.设计目标是紧凑存储整数元素,以减少内存占用。它采用了特定的编码方式,使得每个元素的存储空间尽可能小。

skiplist

1.它的多层结构使得在搜索和插入操作中可以进行跳跃式的操作,而不必每次都从头遍历整个链表。这提高了搜索和插入的效率。

2.由于元素是有序的,因此支持范围查询非常高效。通过在多层链表中跳跃,可以快速定位到指定范围的元素

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/248268.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】03快速上手爬虫案例三:搞定药师帮

文章目录 前言1、破解验证码2、获取数据 前言 提示:通过用户名、密码、搞定验证码,登录进药师帮网站,然后抓取想要的数据。 爬取数据,最终效果图: 1、破解验证码 使用药师帮测试系统:https://dianrc.ysb…

【保驾护航】HarmonyOS应用开发者基础认证-题库-2024

通过系统化的课程学习,熟练掌握DevEco Studio,ArkTS,ArkUI,预览器,模拟器,SDK等HarmonyOS应用开发的关键概念,具备基础的应用开发能力。 考试说明 1、考试需实名认证,请在考前于个…

有哪些ssl证书推荐

SSL证书是由CA认证机构颁发的数字证书,可以用来实现网站的身份验证和数据加密,保障用户与网站之间的通信安全。现在市场上知名的CA认证机构Digicert、Sectigo、Certum等,都已经成立了几十年,每年都要进行WebTrust安全审计&#xf…

HTTPS 之fiddler抓包--jmeter请求

一、浅谈HTTPS 我们都知道HTTP并非是安全传输,在HTTPS基础上使用SSL协议进行加密构成的HTTPS协议是相对安全的。目前越来越多的企业选择使用HTTPS协议与用户进行通信,如百度、谷歌等。HTTPS在传输数据之前需要客户端(浏览器)与服…

【Python笔记-设计模式】抽象工厂模式

一、说明 (一) 解决问题 抽象工厂是一种创建型设计模式,主要解决接口选择的问题。能够创建一系列相关的对象,而无需指定其具体类。 (二) 使用场景 系统中有多于一个的产品族,且这些产品族类的产品需实现同样的接口。 例如:有…

数字人解决方案VividTalk——音频驱动单张照片实现人物头像说话的效果

前言 VividTalk是一项由南京大学、阿里巴巴、字节跳动和南开大学共同开发的创新项目。该项目通过结合单张人物静态照片和一段语音录音,能够制作出一个看起来仿佛实际说话的人物视频。项目的特点包括自然的面部表情和头部动作,口型能够同步,同…

HarmonyOS 鸿蒙驱动消息机制管理

驱动消息机制管理 使用场景 当用户态应用和内核态驱动需要交互时,可以使用HDF框架的消息机制来实现。 接口说明 消息机制的功能主要有以下两种: 用户态应用发送消息到驱动。 用户态应用接收驱动主动上报事件。 表1 消息机制接口 方法描述struct …

防御保护笔记02

防火墙 防火墙的主要职责在于:控制和防护 ---- 安全策略 --- 防火墙可以根据安全策略来抓取流量 防火墙分类 按物理特性划分 软件防火墙 硬件防火墙 按性能划分 百兆级防火墙 吞吐量:指对网络、设备、端口、虚电路或其他设施,单位时间内成…

架构整洁之道-价值维度与编程范式

1 设计与架构究竟是什么 结论:二者没有任何区别,一丁点区别都没有。 架构图里实际上包含了所有底层设计细节,这些细节信息共同支撑了顶层的架构设计,底层设计信息和顶层架构设计共同组成了整个架构文档。底层设计细节和高层架构信…

最新GPT4.0使用教程,AI绘画-Midjourney绘画,GPT语音对话使用,DALL-E3文生图+思维导图一站式解决

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画,文档对话总结DALL-E3文生图,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和…

【HarmonyOS应用开发】ArkUI 开发框架-基础篇-第一部分(七)

常用基础组件 一、组件介绍 组件(Component)是界面搭建与显示的最小单位,HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件,我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。组件根据功能可以分为以下五大类…

深入理解Redis:如何设置缓存数据的过期时间及其背后的机制

目录 Redis 给缓存数据设置过期时间 Redis是如何判断数据是否过期的呢? 过期的数据的删除策略 Redis 内存淘汰机制 Redis 给缓存数据设置过期时间 一般情况下,我们设置保存的缓存数据的时候都会设置一个过期时间。为什么呢? 因为内存是有…

Django模型(一)

一、介绍 模型,就是python中的类对应数据库中的表 1.1、ORM ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写 ORM 把数据库映射成对象 1.…

【Linux】压缩脚本、报警脚本

一、压缩搅拌 要求: 写一个脚本,完成如下功能 传递一个参数给脚本,此参数为gzip、bzip2或者xz三者之一; (1) 如果参数1的值为gzip,则使用tar和gzip归档压缩/etc目录至/backups目录中,并命名为/backups/etc…

Java-并发高频面试题

1.说一下你对Java内存模型(JMM)的理解? 其实java内存模型是一种抽象的模型,具体来看可以分为工作内存和主内存。 JMM规定所有的变量都会存储再主内存当中,再操作的时候需要从主内存中复制一份到本地内存(c…

C++(6) 继承

文章目录 继承1. 继承1.1 什么是继承1.2 C 继承方式1.2.1 基本案例1.2.2 继承权限组合1.2.3 继承中构造函数的说法1.2.4 继承中析构函数的执行顺序1.2.5 继承中变量名称冲突问题1.2.6 继承中函数【重写】 继承 1. 继承 1.1 什么是继承 面向对象程序设计中最重要的一个概念是继…

【linux】复制cp和硬连接、软连接的区别? innode 关系?

1.命令: cp -r [源文件或目录] [目的目录] #复制 ln -s [被链接的文件] [链接的目录/名称] #软连接 ln [被链接的文件] [链接的目录/名称] #硬连接 注:cp -r 会把所有source当作普通文件(regular文件)&#x…

把批量M3U8网络视频地址转为MP4视频

在数字媒体时代,视频格式的转换已成为一项常见的需求。尤其对于那些经常处理网络视频的用户来说,将M3U8格式的视频转换为更常见的MP4格式是一项必备技能。幸运的是,现在有了固乔剪辑助手这款强大的工具,这一过程变得异常简单。下面…

03:华为云管理|云主机管理|云项目实战

华为云管理|云主机管理|云项目实战 安全组配置部署跳板机配置yum源,安装软件包优化系统服务安装配置ansible管理主机 模版镜像配置配置yum源,安装软件包优化系统 网站云平台部署实战华为云的负载均衡 安全组配置 设置安全组 云…

MongoDB常用命令

3.1 案例需求 存放文章评论的数据存放到MongoDB中,数据结构参考如下: 数据库:articledb 3.2 数据库操作 3.2.1 选择和创建数据库 选择和创建数据库的语法格式: use 数据库名称 如果数据库不存在则自动创建,例如&a…