Redis 5 种基本数据类型的前两个详解

news2024/11/17 16:50:28

Redis 共有 5 种基本数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。

这 5 种数据类型是直接提供给用户使用的,是数据的保存形式,其底层实现主要依赖这 8 种数据结构:简单动态字符串(SDS)、LinkedList(双向链表)、Dict(哈希表/字典)、SkipList(跳跃表)、Intset(整数集合)、ZipList(压缩列表)、QuickList(快速列表)。

Redis 5 种基本数据类型对应的底层数据结构实现如下表所示:

StringListHashSetZset
SDSLinkedList/ZipList/QuickListDict、ZipListDict、IntsetZipList、SkipList

Redis 3.2 之前,List 底层实现是 LinkedList 或者 ZipList。 Redis 3.2 之后,引入了 LinkedList 和 ZipList 的结合 QuickList,List 的底层实现变为 QuickList。从 Redis 7.0 开始, ZipList 被 ListPack 取代。

你可以在 Redis 官网上找到 Redis 数据类型/结构非常详细的介绍:

  • Redis Data Structures
  • Redis Data types tutorial

未来随着 Redis 新版本的发布,可能会有新的数据结构出现,通过查阅 Redis 官网对应的介绍,你总能获取到最靠谱的信息。

String(字符串)

介绍

String 是 Redis 中最简单同时也是最常用的一个数据类型。

String 是一种二进制安全的数据类型,可以用来存储任何类型的数据比如字符串、整数、浮点数、图片(图片的 base64 编码或者解码或者图片的路径)、序列化后的对象。

虽然 Redis 是用 C 语言写的,但是 Redis 并没有使用 C 的字符串表示,而是自己构建了一种 简单动态字符串(Simple Dynamic String,SDS)。相比于 C 的原生字符串,Redis 的 SDS 不光可以保存文本数据还可以保存二进制数据,并且获取字符串长度复杂度为 O(1)(C 字符串为 O(N)),除此之外,Redis 的 SDS API 是安全的,不会造成缓冲区溢出。

常用命令

命令介绍
SET key value设置指定 key 的值
SETNX key value只有在 key 不存在时设置 key 的值
GET key获取指定 key 的值
MSET key1 value1 key2 value2 ……设置一个或多个指定 key 的值
MGET key1 key2 ...获取一个或多个指定 key 的值
STRLEN key返回 key 所储存的字符串值的长度
INCR key将 key 中储存的数字值增一
DECR key将 key 中储存的数字值减一
EXISTS key判断指定 key 是否存在
DEL key(通用)删除指定的 key
EXPIRE key seconds(通用)给指定 key 设置过期时间

更多 Redis String 命令以及详细使用指南,请查看 Redis 官网对应的介绍:Commands | Docs 。

基本操作

> SET key value
OK
> GET key
"value"
> EXISTS key
(integer) 1
> STRLEN key
(integer) 5
> DEL key
(integer) 1
> GET key
(nil)

批量设置

> MSET key1 value1 key2 value2
OK
> MGET key1 key2 # 批量获取多个 key 对应的 value
1) "value1"
2) "value2"

计数器(字符串的内容为整数的时候可以使用):

> SET number 1
OK
> INCR number # 将 key 中储存的数字值增一
(integer) 2
> GET number
"2"
> DECR number # 将 key 中储存的数字值减一
(integer) 1
> GET number
"1"

设置过期时间(默认为永不过期)

> EXPIRE key 60
(integer) 1
> SETEX key 60 value # 设置值并设置过期时间
OK
> TTL key
(integer) 56

应用场景

需要存储常规数据的场景

  • 举例:缓存 Session、Token、图片地址、序列化后的对象(相比较于 Hash 存储更节省内存)。
  • 相关命令:SETGET

需要计数的场景

  • 举例:用户单位时间的请求数(简单限流可以用到)、页面单位时间的访问数。
  • 相关命令:SETGETINCRDECR

分布式锁

利用 SETNX key value 命令可以实现一个最简易的分布式锁(存在一些缺陷,通常不建议这样实现分布式锁)。

List(列表)

介绍

Redis 中的 List 其实就是链表数据结构的实现。我在 线性数据结构 :数组、链表、栈、队列 这篇文章中详细介绍了链表这种数据结构,我这里就不多做介绍了。

许多高级编程语言都内置了链表的实现比如 Java 中的 LinkedList,但是 C 语言并没有实现链表,所以 Redis 实现了自己的链表数据结构。Redis 的 List 的实现为一个 双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。

 

常用命令

命令介绍
RPUSH key value1 value2 ...在指定列表的尾部(右边)添加一个或多个元素
LPUSH key value1 value2 ...在指定列表的头部(左边)添加一个或多个元素
LSET key index value将指定列表索引 index 位置的值设置为 value
LPOP key移除并获取指定列表的第一个元素(最左边)
RPOP key移除并获取指定列表的最后一个元素(最右边)
LLEN key获取列表元素数量
LRANGE key start end获取列表 start 和 end 之间 的元素

更多 Redis List 命令以及详细使用指南,请查看 Redis 官网对应的介绍:Commands | Docs 。

通过 RPUSH/LPOP 或者 LPUSH/RPOP实现队列

> RPUSH myList value1
(integer) 1
> RPUSH myList value2 value3
(integer) 3
> LPOP myList
"value1"
> LRANGE myList 0 1
1) "value2"
2) "value3"
> LRANGE myList 0 -1
1) "value2"
2) "value3"

通过 RPUSH/RPOP或者LPUSH/LPOP 实现栈

> RPUSH myList2 value1 value2 value3
(integer) 3
> RPOP myList2 # 将 list的最右边的元素取出
"value3"

我专门画了一个图方便大家理解 RPUSH , LPOP , lpush , RPOP 命令:

通过 LRANGE 查看对应下标范围的列表元素

> RPUSH myList value1 value2 value3
(integer) 3
> LRANGE myList 0 1
1) "value1"
2) "value2"
> LRANGE myList 0 -1
1) "value1"
2) "value2"
3) "value3"

通过 LRANGE 命令,你可以基于 List 实现分页查询,性能非常高!

通过 LLEN 查看链表长度

> LLEN myList
(integer) 3

应用场景

信息流展示

  • 举例:最新文章、最新动态。
  • 相关命令:LPUSHLRANGE

消息队列

List 可以用来做消息队列,只是功能过于简单且存在很多缺陷,不建议这样做。

相对来说,Redis 5.0 新增加的一个数据结构 Stream 更适合做消息队列一些,只是功能依然非常简陋。和专业的消息队列相比,还是有很多欠缺的地方比如消息丢失和堆积问题不好解决。

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

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

相关文章

qos在企业网中的设计与实现

1.拓扑 地址规划 业务地址规划 部门 地址空间 vlan 网关 市场部门 10.0.100.0/24 Vlan100 10.0.100.254/24 研发部门 10.0.101.0/24 Vlan101 10.0.101.254/24 财务部门 10.0.102.0/24 Vlan102 10.0.102.254/24 人力部门 10.0.103.0/24 Vlan103 10.0.103.25…

[nmap] 端口扫描工具的下载及详细安装使用过程(附有下载文件)

nmap网络连接端扫描软件,用于主机发现、端口扫描、版本侦测、操作系统侦测 下载链接在文末 下载压缩包后解压 !!安装路径不要有中文 解压得到文件 双击.exe文件 更改安装路径并点击安装 等待安装 安装完成 nmap-7.95-setup.zip 夸克网盘打开…

pip install kaggle-environments ISSUE:Failed to build vec-noise

ISSUE: error: Microsoft Visual C 14.0 or greater is required. Get it with “Microsoft C Build Tools”: https://visualstudio.microsoft.com/visual-cpp-build-tools/ [end of output]Failed to build vec-noiseC:\ProgramData\miniconda3\include\pyconfig.h(59): fat…

基于Springboot+Vue的家校互联系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

信息安全工程师(41)VPN概述

前言 VPN,即Virtual Private Network(虚拟专用网络)的缩写,是一种通过公共网络(如互联网)创建私密连接的技术。 一、定义与工作原理 定义:VPN是依靠ISP(Internet Service Provider&…

国庆档不太热,影视股“凉”了?

今年国庆档票房止步21亿元,属实有点差强人意。 根据国家电影局统计,2024年国庆档(2024年10月1日至7日)全国电影票房为21.04亿元,观影人次为5209万,总票房成绩、观影总人次同比均有所下滑。 作为传统观影高…

AS-REP Roasting 实验

1. 实验网络拓扑 kali: 192.168.72.128win2008: 192.168.135.129 192.168.72.139win7: 192.168.72.149win2012:(DC) 192.168.72.131 2. 攻击原理 如果设置了不需要Kerberos预认证: 那么就可以直接发AS_REQ请求TGT票据,由于不要求预身份认证&#xff0…

FLORR.IO画廊(3)

锯齿(超级) 是florr.io的一种辅助型花瓣,可以用于提升碰撞伤害。玩家装备后,外观会显示出一圈转动的齿轮,就像digdig.io中的玩家一样。不堆叠 圆盘(超级) 是Florr.io的一种削伤型花瓣&#xff…

女性议题,正在成为喜综困境?

《脱口秀和Ta的朋友们》(以下简称《脱友》)与《喜剧之王单口季》(以下简称《喜单》)两档喜综的对垒,竟然意外走向了同一个落点:对女性视角的收割。 #杨笠 这是血肉在疯长的声音# #杨笠 不是敢说是不知道这…

2020年华为杯数学建模竞赛D题论文和代码

无人机集群协同对抗 摘 要: 本文针对非线性约束条件下红蓝双方无人机集群协同对抗的最优规划问题,结合贪婪队形、非线性规划、内点法、蒙特卡洛方法和全联立正交配置有限元法,构建了无人机集群协同对抗推演模型。 针对问题一&#…

绘图库turtle及其应用

一、排雷避坑 1. no attribute ‘pensize’ ① 文件命名避免使用库/模块的名字为名,会报错。 例如:当使用matplotlib库时,将文件名命名为matplotlib.py,会报错 ModuleNotFoundError: No module named ‘matplotlib.pyplot’; ‘…

vue 的属性绑定

双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute&#xff0c;应该使用 v-bind 指令。 <template> <div v-bind:class"boxClass" v-bind:id"boxId"> </div> </template><script> export default{da…

SameFileMarker:重复文件标记工具

使用智能手机时&#xff0c;因为顾虑存储空间不够&#xff0c;都会定期把占用大量空间的照片视频备份到电脑&#xff0c;但每次备份到电脑的照片&#xff0c;总有一些想随时查看的照片不舍得从手机删掉&#xff0c;于是这些照片在下次手动备份时又会被再次备份。 为了应对这种情…

21.数据结构与算法-遍历二叉树/三种遍历算法/递归遍历/非递归遍历/建立,复制二叉树/求二叉树的深度,节点个数,叶子节点个数

遍历二叉树 遍历方法 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 例题 根据遍历顺序确定二叉树 遍历的算法实现-先序遍历 遍历算法实现-中序遍历 遍历的算法实现-后序遍历 三种算法分析 遍历二叉树的非递归算法-中序遍历 二叉树的层次遍历 建立二叉树 复制二叉树 计算二叉树…

【Linux-SSH远程窗口回传】使用X11或Wayland进行SSH窗口转发

前言 我们通常在进行远程配置板端的时候往往会出现一个问题&#xff0c;在不连接显示屏或者启用VNC服务的前提下(或者使用其他软件提供的功能)&#xff0c;我们无法在远程终端看到板端的新窗口。 例如下图是一个通过远程SSH连接后企图在终端进行OpenCV窗口显示的代码报错 错误…

5.toString()、构造方法、垃圾回收、静态变量与静态方法、单例设计模式、内部类

文章目录 一、toString()1. 优缺点2. 使用方法举例① Dos类里更省事的方法 ② Application里 二、构造方法1. 导入2. 什么是构造方法3. 怎么写构造方法① 无参的构造方法(无参构造器)② 有参的构造方法(有参构造器)③ 注意 4. 构造方法的重载 三、再探this1. 给成员变量用2. 给…

基于ssm的教务管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 在高等院校的教学科研活动中&#xff0c;最重要的部门是学校的教务管理部门。教务管理工作是现代高等院校培养人才的核心工作。高校教务工作具有一个很明显的特征&#xff0c;就是围绕着学生为中心&#xff0c;以学生作为管理对…

ROS2-Jazzy(一):让小乌龟跑起来

配置ROS2 ros为了使一个系统中可以存在多个不同版本的ros&#xff0c;将ros的配置指令写成了脚本&#xff0c;要用ros前根据自己所需要执行对应的脚本 source /opt/ros/jazzy/setup.zsh如果你只用一个版本的ros&#xff0c;可以将执行脚本的指令写到对应shell的配置文件里&am…

STM32 ADC学习日记

STM32 ADC学习日记 1. ADC简介 ADC 即模拟数字转换器&#xff0c;英文详称 Analog-to-digital converter&#xff0c;可以将外部的模拟信号转换为数字信号。 STM32F103 系列芯片拥有 3 个 ADC&#xff08;C8T6 只有 2 个&#xff09;&#xff0c;这些 ADC 可以独立使用&…

10.9 Qt事件处理机制

键盘按键调整label移动 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QKeyEvent>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);}Widget::~Widget() {delete ui;…