【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的时序图:
(一)添加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. 设置过期时间(可选)
如果命令中包含EX
或PX
选项,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的过程包括:
- 添加:通过
SET
命令创建或更新键值对,支持过期时间设置。 - 删除:通过
DEL
或UNLINK
命令删除键。 - 修改:通过
SET
或SETRANGE
命令更新键的值。 - 查询:通过
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语…...

Prompt提示词完整案例:让chatGPT成为“书单推荐”的高手
大家好,我是老六哥,我正在共享使用AI提高工作效率的技巧。欢迎关注我,共同提高使用AI的技能,让AI成功你的个人助理。 许多人可能会跟老六哥一样,有过这样的体验:当我们遇到一个能力出众或对事物有独到见解的…...

基于django的智能停车场车辆管理深度学习车牌识别系统
完整源码项目包获取→点击文章末尾名片!...

【Proteus仿真】【51单片机】简易计算器系统设计
目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键 3、可以进行简单的加减乘除运算 4、最大 9999*9999 二、使用步骤 系统运行后,LCD1602显示数据,通过矩阵按键…...

洛谷P3884 [JLOI2009] 二叉树问题(详解)c++
题目链接:P3884 [JLOI2009] 二叉树问题 - 洛谷 | 计算机科学教育新生态 1.题目解析 1:从8走向6的最短路径,向根节点就是向上走,从8到1会经过三条边,向叶节点就是向下走,从1走到6需要经过两条边,…...

《Foundation 起步》
《Foundation 起步》 引言 Foundation 是一个广泛使用的开源前端框架,由 ZURB 团队创建。它旨在帮助开发者构建响应式、可访问性和移动优先的网页。本文将为您提供一个全面的指南,帮助您从零开始学习并使用 Foundation。 Foundation 简介 什么是 Foundation? Foundatio…...

【hot100】刷题记录(6)-轮转数组
题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转…...
Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin
Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.RectF …...

ThinkPad E480安装Ubuntu 18.04无线网卡驱动
个人博客地址:ThinkPad E480安装Ubuntu 18.04无线网卡驱动 | 一张假钞的真实世界 遗憾的是虽然下面的方法可以解决,但是内核升级后需要重新安装。 基本信息 Ubuntu 18.04ThinkPad E480使用下面的命令查看 Linux 内核: $ uname -r 5.0.0-3…...

自然语言处理——从原理、经典模型到应用
1. 概述 自然语言处理(Natural Language Processing,NLP)是一门借助计算机技术研究人类语言的科学,是人工智能领域的一个分支,旨在让计算机理解、生成和处理人类语言。其核心任务是将非结构化的自然语言转换为机器可以…...

Ollama 运行从 ModelScope 下载的 GGUF 格式的模型
本文系统环境 Windows 10 Ollama 0.5.7 Ollama 是什么? Ollama 可以让你快速集成和部署本地 AI 模型。它支持各种不同的 AI 模型,并允许用户通过简单的 API 进行调用 Ollama 的安装 Ollama 官网 有其下载及安装方法,非常简便 但如果希…...