当前位置: 首页 > news >正文

【redis】Redis操作String类型key的发生了什么?

关于Redis操作(添加、删除、修改、查询)String类型key的完整过程,包括引用源码数据、时序图、磁盘IO读写、数据长度限制和故障处理机制。


数据结构

Redis对象(robj

typedef struct redisObject {unsigned type:4;          // 对象类型(如字符串)unsigned encoding:4;      // 对象的编码方式(如 RAW、INT、EMBSTR)unsigned lru:LRU_BITS;    // LRU 时间戳,用于过期和淘汰策略int refcount;             // 引用计数,用于内存管理void *ptr;                // 指向实际数据的指针
} robj;

时序图

以下是Redis操作String类型key的时序图:

Redis Client Redis Server SET mykey "Hello" EX 60 OK GET mykey Hello SET mykey "New Value" OK DEL mykey 1 Redis Client Redis Server

(一)添加String类型key

1. 客户端发送命令

客户端通过Redis客户端库(如redis-cli或编程语言的Redis客户端)发送SET命令,格式为:

SET key value [EX seconds] [PX milliseconds] [NX|XX]

例如:

SET mykey "Hello" EX 60

此命令将值"Hello"存储到键mykey中,并设置其过期时间为60秒[45]。

2. 服务器处理命令

Redis服务器接收到SET命令后,执行以下操作:

  • 检查键是否存在:如果命令中包含NX选项(不存在时才设置),服务器会检查键是否已存在。如果键已存在,则返回错误[45]。
  • 创建或更新键值对:如果键不存在,服务器会创建一个新的键值对;如果键已存在,服务器会更新键的值[45]。
3. 数据存储过程
  • 键的存储:键通过字典(Dictionary)存储,字典基于哈希表实现。键的哈希值被计算并映射到哈希表中的一个槽(slot)[48]。

  • 值的存储:值被封装为Redis对象(robj

    对于String类型的值,ptr指向一个SDS(Simple Dynamic String)对象[48]。

4. 设置过期时间(可选)

如果命令中包含EXPX选项,Redis会为键设置过期时间:

  • EX选项设置过期时间为秒级[45]。
  • PX选项设置过期时间为毫秒级[45]。
5. 返回结果

命令执行完成后,Redis服务器返回结果:

  • 如果设置成功,返回OK[45]。

(二)删除String类型key

1. 客户端发送命令

客户端发送DEL命令删除键:

DEL key
2. 服务器处理命令

Redis服务器接收到DEL命令后:

  • 查找指定的键,如果键存在,则从字典中删除该键[43]。
  • 如果键不存在,返回0;如果删除成功,返回1[43]。
3. 数据删除过程
  • Redis通过字典的dictDel函数删除键值对。如果键对应的值是大对象(如大字符串),可以使用UNLINK命令异步删除,避免阻塞主线程[46]。
4. 返回结果

命令执行完成后,Redis返回删除的键的数量[43]。


(三)修改String类型key

1. 客户端发送命令

客户端发送SET命令更新键的值:

SET key new_value
2. 服务器处理命令

Redis服务器接收到SET命令后:

  • 如果键已存在,更新键的值[45]。
  • 如果键不存在,创建新的键值对[45]。
3. 数据更新过程
  • 键值对的更新通过字典的dictReplace函数完成[48]。
  • 如果键对应的值是大对象,可以使用SETRANGE命令修改部分值[47]。
4. 返回结果

命令执行完成后,Redis返回OK[45]。


(四)查询String类型key

1. 客户端发送命令

客户端发送GET命令查询键的值:

GET key
2. 服务器处理命令

Redis服务器接收到GET命令后:

  • 查找指定的键,如果键存在,返回键的值[47]。
  • 如果键不存在,返回nil[47]。
3. 数据查询过程
  • Redis通过字典的dictFind函数查找键,并返回对应的值[48]。
4. 返回结果

命令执行完成后,Redis返回键的值[47]。


持久化

Redis主要是一个内存存储系统,但为了持久化数据,它支持以下两种持久化机制:

(一)RDB(Redis Database File)

  • RDB是Redis的快照持久化机制,它会定期将内存中的数据写入磁盘,生成一个RDB文件[50]。
  • 当添加或更新String类型的键值对时,Redis会根据配置的策略(如save选项)触发RDB持久化[50]。

(二)AOF(Append Only File)

  • AOF是Redis的追加文件持久化机制,它会将每个写操作追加到AOF文件中[50]。
  • 当执行SET命令时,Redis会将该操作追加到AOF文件中[50]。

数据长度限制

Redis对String类型key的值大小有限制:

  • 单个String类型的值最大长度为512MB[49]。
  • 如果值超过512MB,可能会导致性能问题或内存不足[49]。

优化建议:

  • 对于较大的值,可以采用压缩算法进行压缩,减小值的大小[49]。
  • 使用Redis集群将数据分布在多个节点上,增加总的内存容量[49]。

故障处理机制

(一)大Key删除

  • 同步删除:使用DEL命令直接删除大Key,可能会阻塞主线程[46]。
  • 异步删除:使用UNLINK命令异步删除大Key,Redis会在后台逐步释放内存[46]。

(二)内存不足

  • 如果Redis内存不足,可以配置maxmemory策略,自动淘汰旧数据[50]。
  • 使用MEMORY PURGE命令释放未使用的内存[50]。

(三)数据丢失

  • 启用RDB和AOF持久化机制,确保数据在故障时能够恢复[50]。

接口

Redis操作String类型key的过程包括:

  1. 添加:通过SET命令创建或更新键值对,支持过期时间设置。
  2. 删除:通过DELUNLINK命令删除键。
  3. 修改:通过SETSETRANGE命令更新键的值。
  4. 查询:通过GET命令获取键的值。

Redis通过高效的哈希表和动态字符串结构,实现了快速的键值操作。同时,通过RDB和AOF机制,Redis确保了数据的持久化。对于大Key和内存不足等问题,Redis提供了多种优化和故障处理机制,保证系统的稳定性和性能。

相关文章:

【redis】Redis操作String类型key的发生了什么?

关于Redis操作(添加、删除、修改、查询)String类型key的完整过程,包括引用源码数据、时序图、磁盘IO读写、数据长度限制和故障处理机制。 数据结构 Redis对象(robj) typedef struct redisObject {unsigned type:4; …...

hdfs之读写流程

写入流程: 客户端Client想将文件a.txt上传至hdfs,首先向Namenode发送请求进行权限校验,Namenode通过后会计算出来三个节点,并将这三个节点告知客户端,客户端将输入进行切割成块,一个一个的块进行传输&…...

研发的立足之本到底是啥?

0 你的问题,我知道! 本文深入T型图“竖线”的立足之本:专业技术 技术赋能业务能力。研发在学习投入精力最多,也误区最多。 某粉丝感发展遇到瓶颈,项目都会做,但觉无提升,想跳槽。于是&#x…...

Baklib揭示内容中台与人工智能技术的创新协同效应

内容概要 在当今信息爆炸的时代,内容的高效生产与分发已成为各行业竞争的关键。内容中台与人工智能技术的结合,为企业提供了一种新颖的解决方案,使得内容创造的流程更加智能化和高效化。 内容中台作为信息流动的核心,能够集中管…...

智慧消防营区一体化安全管控 2024 年度深度剖析与展望

在 2024 年,智慧消防营区一体化安全管控领域取得了令人瞩目的进展,成为保障营区安全稳定运行的关键力量。这一年,行业在政策驱动、技术创新应用、实践成果及合作交流等方面呈现出多元且深刻的发展态势,同时也面临着一系列亟待解决…...

自定义数据集,使用 PyTorch 框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

在本文中,我们将展示如何使用 NumPy 创建自定义数据集,利用 PyTorch 实现一个简单的逻辑回归模型,并在训练完成后保存该模型,最后加载模型并用它进行预测。 1. 创建自定义数据集 首先,我们使用 NumPy 创建一个简单的…...

UE5 特效

能帮到你的话,就给个赞吧 😘 文章目录 post processexposurebloomvignettesaturationunbound material材质蓝图alt z base colorconstant3Vector roughnessconstant metallicconstant pbrroughnessmetallicmake more realmake some areas rougher than o…...

CMAKE工程编译好后自动把可执行文件传输到远程开发板

# 设置 CMake 最低版本要求 cmake_minimum_required(VERSION 3.10)# 设置项目名称 project(MyProject)# 添加可执行文件,这里以项目名作为可执行文件的名称 add_executable(${PROJECT_NAME} main.cpp)# 设置开发板信息 set(DEVELOPMENT_BOARD_IP "192.168.1.10…...

Windows 程序设计7:文件的创建、打开与关闭

文章目录 前言一、文件的创建与打开CreateFile1. 创建新的空白文件2. 打开已存在文件3. 打开一个文件时,如果文件存在则打开,如果文件不存在则新创建文件4.打开一个文件,如果文件存在则打开文件并清空内容,文件不存在则 新创建文件…...

策略模式 - 策略模式的使用

引言 在软件开发中,设计模式是解决常见问题的经典解决方案。策略模式(Strategy Pattern)是行为型设计模式之一,它允许在运行时选择算法的行为。通过将算法封装在独立的类中,策略模式使得算法可以独立于使用它的客户端…...

具身智能研究报告

参考: (1)GTC大会&Figure:“具身智能”奇点已至 (2)2024中国具身智能创投报告 (3)2024年具身智能产业发展研究报告 (4)具身智能行业深度:发展…...

Windows安装Milvus

安装Milvus 安装Docker前置条件: 安装Mlivus方案一方案二 Attu管理端 安装Docker 系统:Windows 11 家庭中文版 Mlivus:V2.3.0 Attu: V2.3.10 前置条件: 启用“适用于 Linux 的 Windows 子系统”可选功能,才能在 Win…...

Excel分区间统计分析(等步长、不等步长、多维度)

在数据分析过程中,可能会需要统计不同数据区间的人数、某个数据区间的平均值或者进行分组区间统计,本文从excel函数到数据透视表的方法,从简单需求到复杂需求,采用不同的方法进行讲解,尤其是通过数据透视表的强大功能大…...

宝塔mysql数据库容量限制_宝塔数据库mysql-bin.000001占用磁盘空间过大

磁盘空间占用过多,排查后发现网站/www/wwwroot只占用7G,/www/server占用却高达8G,再深入排查发现/www/server/data目录下的mysql-bin.000001和mysql-bin.000002两个日志文件占去了1.5G空间。 百度后学到以下知识,做个记录。 mysql…...

LeetCode 2412.完成所有交易的初始最少钱数:【年度巨献】举例说明(讲明白),由难至简(手脚不乱),附Python一行版

【LetMeFly】2412.完成所有交易的初始最少钱数:【年度巨献】举例说明(讲明白),由难至简(手脚不乱),附Python一行版 文章目录 【LetMeFly】2412.完成所有交易的初始最少钱数:【年度巨献】举例说明(讲明白),由难至简(手脚…...

多人-多agent协同可能会挑战维纳的反馈

在多人-多Agent协同系统中,维纳的经典反馈机制将面临新的挑战,而协同过程中的“算计”(策略性决策与协调)成为实现高效协作的核心。 1、非线性与动态性 维纳的反馈理论(尤其是在控制理论中)通常假设系统的动…...

Go学习:类型转换需注意的点 以及 类型别名

目录 1. 类型转换 2. 类型别名 1. 类型转换 在从前的学习中,知道布尔bool类型变量只有两种值true或false,C/C、Python、JAVA等编程语言中,如果将布尔类型bool变量转换为整型int变量,通常采用 “0为假,非0为真”的方…...

C语言中的局部变量和全局变量有什么区别?

在C语言中,局部变量和全局变量是两种具有不同作用域和存储期的变量。以下是它们之间的主要区别: 作用域 局部变量: 局部变量是在函数内部声明的变量。它们的作用域仅限于声明它们的函数内部。一旦函数执行完毕,局部变量就会超出…...

价值交换到底在交换什么

有人十多岁就很清醒,知道自己想要什么,要付出什么。有人20多岁清醒了,有人30多岁都不一定明白。 价值交换,四个字其实就可以解释大部分事情。价值交换和努力工作,勤劳没有任何关系。甚至努力和成功都不存在关系。 价值…...

C++传送锚点的内存寻址:内存管理

文章目录 1.C/C内存分布回顾2.C内存管理2.1 内存申请2.2 operator new与operator delete函数2.3 定位new表达式 3.关于内存管理的常见知识点3.1 malloc/free和new/delete的区别3.2 内存泄漏 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 继C语…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...