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.mzph.cn/news/652530.shtml

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

相关文章

以太网交换基础VLAN原理与配置

目录 7.以太网交换基础 7.1.以太网协议 7.2.以太网帧介绍 7.3.以太网交换机 7.4.同网段数据通信全过程 8.VLAN原理与配置 8.1.VLAN的基本概念 8.2.VLAN的应用 7.以太网交换基础 7.1.以太网协议 以太网是当今现有局域网(Local Area Network,LAN)采用的最通用的通信协议…

SpringBoot自定义全局异常处理器

文章目录 一、介绍二、实现1. 定义全局异常处理器2. 自定义异常类 三、使用四、疑问 一、介绍 Springboot框架提供两个注解帮助我们十分方便实现全局异常处理器以及自定义异常。 ControllerAdvice 或 RestControllerAdvice(推荐)ExceptionHandler 二、…

Python第 1 课 Python 介绍与安装

文章目录 第 1 课 Python 介绍与安装1.Python介绍1.1 面向对象概述1.2 Python 概述1.3 Python 特点 2.查看Python3.pyCharm 安装方法3.1 下载 pyCharm3.2 打开 pyCharm3.3 汉化 pyCharm3.4 pyCharm 的基本介绍和基本使用方法 第 1 课 Python 介绍与安装 1.Python介绍 1.1 面向…

消息中间件之八股面试回答篇:三、RabbitMQ如何解决消息堆积问题(100万条消息堆积)+RabbitMQ高可用性和强一致性机制+回答模板

RabbitMQ中的消息堆积问题 当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题。 解决消息堆积有三种种思路…

网络工程师必学知识:2、数据链路层-II型以太帧的封装

1.概述: 针对于链路层,华为官网IP报文格式大全里面包含了很多。如下图: 今天主要分析Ethernet II以太帧。 2.Frame Format: 12Byte(inter frame gap)|7B(同步码)|1B(定界符)|6B(DMAC)|6B(SMAC)|2B(Type)…

【Demo】基于CharacterController组件的角色控制

项目介绍 项目名称:Demo1 项目版本:1.0 游戏引擎:Unity2020.3.26f1c1 IDE:Visual Studio Code 关键词:Unity3D,CharacterController组件,角色控制,自定义按键,Scrip…

解决PyCharm的Terminal终端conda环境默认为base无法切换的问题

问题描述 在使用PyCharm的Terminal终端时,打开的默认环境为base。 在使用切换命令时,依旧无法解决。 解决方法 1、输入以下命令以查看conda的配置信息: conda config --show2、在输出中找到 auto_activate_base 的行,发现被…

IMX6ULL驱动学习——通过总线设备驱动模型点亮野火开发板小灯【参考韦东山老师教程】

参考:【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想(学习设备树过渡部分)-CSDN博客 韦东山课程:LED模板驱动程序的改造_总线设备驱动模型 我使用的开发板:野火imx6ull pro 欢迎大家一起讨论学习 实现了总线设…

uniapp 实现路由拦截,权限或者登录控制

背景: 项目需要判断token,即是否登录,登录之后权限 参考uni-app官方: 为了兼容其他端的跳转权限控制,uni-app并没有用vue router路由,而是内部实现一个类似此功能的钩子:拦截器,由…

数字图像处理(实践篇)三十三 OpenCV-Python从立体图像创建深度图实践

目录 一 方案 二 实践 双眼视觉是指人类使用两只眼睛同时观察同一场景,通过左右眼的视差来感知深度。左眼和右眼的视差是由于它们在空间中的位置不同而产生的,这种差异可以被大脑解读为物体的距离和深度。为了从立体图像构建深度图,找到两个图像之间的视差,可以初始化并创…

Java强训day7(选择题编程题)

选择题 public class Test01{private static int x 100;public static void main(String[] args) {Test01 hs1 new Test01();hs1.x;Test01 hs2 new Test01();hs2.x;hs1new Test01();hs1.x;Test01.x--;System.out.println("x"x);} }public class Test01{private …

倒排索引的构建与查询

倒排索引是信息检索的重要技术,本文将基于中文短信数据(数据集可在本文所附资源处下载或点击此处链接下载),编程构建倒排索引并实现布尔查询。 1. 功能设计 用户输入查询,按下回车键,如果该查询作为单独的…

Mybatis-Plus入门

Mybatis-Plus入门 MyBatis-Plus 官网:https://mp.baomidou.com/ 1、简介 MyBatis-Plus (简称 MP) 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、 提高效率而生。 https://github.com/baomidou/mybatis-p…

【Java】Spring注解开发

一、Spring注解开发 1 注解开发定义Bean对象【重点】 目的:xml配置Bean对象有些繁琐,使用注解简化Bean对象的定义 问题导入 问题1:使用什么标签进行Spring注解包扫描? 问题2:Component注解和Controller、Service、R…

Blender教程(基础)-初始用户界面-01

开始第一天的Blender学习、也是业余学习。希望记录下这一份学习的过程、并且分享给大家。今天带大家认识Blender这一款软件,先说说我为什么选择了Blender,我在软件市场找了好久,市场上其他雷同软件都是要么收费要么不好用,最终决定…

【Vitest】 Vitest测试框架的简单使用

简言 在了解vue源码的时候接触到了vitest测试框架,它的官网语言有中文,所以本篇只作简单的使用介绍。 Vitest官网 Vitest 旨在将自己定位为 Vite 项目的首选测试框架,即使对于不使用 Vite 的项目也是一个可靠的替代方案。它本身也兼容一些Jest的API用法…

寒假思维训练计划day16 A. Did We Get Everything Covered?

今天更新一道1月27号晚上div2的C题作为素材,感觉用到了我的构造题总结模型,我总结了一系列的模型和例题。 摘要: Part1 定义"边界贪心法" Part2 题意 Part3 题解 Part4 代码 Part5 思维构造题模型和例题 Part1 边界贪心…

【服务器Midjourney】创建部署Midjourney网站

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建MJ】 🌼1. 给服务器添加端口 🌼2. 使用Xshell连接服务器 🌼3. 安装docker 🌼4. 安装Midjourney程序 🌼5. 绑定域名+申请SSL证书 🌼6. 更新网站

全球唯一使用Python生成双色球和大乐透

生成双色球和大乐透代码: import randomdef gen_union_lotto(nums: int):"""随机生成N个双色球:param nums::return:"""union_list []for i in range(0, nums):data []for data_ in range(0, 6):random_num random.randint(1, 33…

电脑 文件夹内 显示是 文件在一起 ,实际存储硬盘的不同地方?

是的,在电脑上,文件夹内显示在一起的文件可能实际上存储在硬盘的不同物理位置。这是因为现代操作系统使用的是文件系统来管理磁盘上的数据,常见的如NTFS(Windows)、HFS(旧版Mac)或APFS&#xff…