当前位置: 首页 > 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提供了多种优化和故障处理机制,保证系统的稳定性和性能。

http://www.lryc.cn/news/528496.html

相关文章:

  • hdfs之读写流程
  • 研发的立足之本到底是啥?
  • Baklib揭示内容中台与人工智能技术的创新协同效应
  • 智慧消防营区一体化安全管控 2024 年度深度剖析与展望
  • 自定义数据集,使用 PyTorch 框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
  • UE5 特效
  • CMAKE工程编译好后自动把可执行文件传输到远程开发板
  • Windows 程序设计7:文件的创建、打开与关闭
  • 策略模式 - 策略模式的使用
  • 具身智能研究报告
  • Windows安装Milvus
  • Excel分区间统计分析(等步长、不等步长、多维度)
  • 宝塔mysql数据库容量限制_宝塔数据库mysql-bin.000001占用磁盘空间过大
  • LeetCode 2412.完成所有交易的初始最少钱数:【年度巨献】举例说明(讲明白),由难至简(手脚不乱),附Python一行版
  • 多人-多agent协同可能会挑战维纳的反馈
  • Go学习:类型转换需注意的点 以及 类型别名
  • C语言中的局部变量和全局变量有什么区别?
  • 价值交换到底在交换什么
  • C++传送锚点的内存寻址:内存管理
  • Prompt提示词完整案例:让chatGPT成为“书单推荐”的高手
  • 基于django的智能停车场车辆管理深度学习车牌识别系统
  • 【Proteus仿真】【51单片机】简易计算器系统设计
  • 洛谷P3884 [JLOI2009] 二叉树问题(详解)c++
  • 《Foundation 起步》
  • 【hot100】刷题记录(6)-轮转数组
  • Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin
  • ThinkPad E480安装Ubuntu 18.04无线网卡驱动
  • 自然语言处理——从原理、经典模型到应用
  • Ollama 运行从 ModelScope 下载的 GGUF 格式的模型
  • Haproxy介绍及学习